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

时间:2017-08-27 14:42:38

标签: 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定义的功能是:

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 and OuterStruct.innerStruct[0].innerId的结果设置了收集值。(在resultStruct值以上)

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

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

1 个答案:

答案 0 :(得分:0)

谢谢大家。

问题是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);