C# 如何在 struct 中使用 struct array 进行 P/Invoke?

标签 c# c visual-studio struct pinvoke

在C#中,如何在struct中对struct数组进行P/Invoke?

C Lang 定义的结构体如下...

struct 'OuterStruct'
  int outerId
  InnerStruct[10] innerStruct 
struct 'InnerStruct'
  int innerId
  char[32] name

而C Lang定义的Function是:

int ClangFunc(OuterStruct* arg)

“ClangFunc”的值设置为“arg”。

我从 C# 调用“ClangFunc”...

[DllImport("makefromclang.dll", EntryPoint="ClangFunc")]
public static extern int ClangFunc(IntPtr arg);

[StructLayout(LayoutKind.Sequential)]
public struct OuterStruct
{
    public int outerId;
    [MarshalAs(UnmanagementType.ByValArray, SizeConst=10)]
    public InnerStuct[] innerStruct;
}

[StructLayout(LayoutKind.Sequential)]
public struct InnerStruct
{
    public int innerId;
    [MarshalAs(UnmanagementType.ByValTStr, SizeConst=32)]
    public string name;
}

/* caller */
OuterStruct outerStruct = new OuterStruct();
IntPtr ptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(outerStruct));
Marshal.StructureToPtr(outerStruct, ptr, false);
int result = ClangFunc(ptr);
OuterStruct resultStruct = (OuterStruct)Marshal.PtrToStructure(ptr, typeof(OuterStruct));

调用ClangFunc成功。

OuterStruct.outerId 和 OuterStruct.innerStruct[0].innerId 的结果被设置收集值。(在上面的 resultStruct 值中)

但是OuterStruct.innerStruct[0].namenull,为什么?

我期望“”(空字符串)或任何Shift_JIS字符串。无法设置 null 值。

最佳答案

谢谢大家。

问题在于 char[] 中设置的值是 Shift_JIS 字符集。 .NET 将 char[] 转换为字符串时,没有考虑字符集。 结果,字符串值被损坏,调试器似乎有一个空字符串值。

为了解决这个问题,我将结构体映射的字符串修改为byte[],并将byte[]转换为字符串。

// [MarshalAs(UnmanagementType.ByValTStr, SizeConst=32)]
// public string name;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType=UnmanagedType.ByValTStr, SizeConst=32)]
public byte[] name;


string str = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(name);

关于C# 如何在 struct 中使用 struct array 进行 P/Invoke?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45906165/

相关文章:

c - 如何更改 C 中的结构数组

php - 从 PHP 执行 C 程序

c++ - 代码覆盖错误(未检测二进制文件)

c# - 告诉,不要问原则和密码过期

c# - 如何在 ASP.NET MVC Web 应用程序中使用 log4net 异步登录而不用尽所有可用线程?

java - 在 Windows 上通过 Java 运行 GTK

visual-studio - 从 Visual Studio 文档缓存中恢复文件?

.net - 将参数从 Bootstrap 传递到MSI bundle

c# - View 订阅 ViewModel 中实例对象的属性

c# - 无法让控制台日志记录在 .net core 2.0 中工作