传递包含C和C#之间结构数组的结构(DLL和P调用)

我有一个复杂的结构C dll我真的是C#的新手:

typedef struct { int a; int b; } simple_struct; typedef struct { int d; int e; simple_struct f[20]; short g; simple_struct h[20]; short i; } complex_struct; 

问题是我无法使用这种结构连接我的C#应用​​程序!

在DLL中有一个函数Ge​​tData(complex_struct * myStruct),我应该从C#中调用它,所以我创建了:

  [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe struct simple_struct { public int a; public int b; } ; [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe struct complex_struct { public int d; public int e; public simple_struct[] f; public short g; public simple_struct[] h; public short i; } ; 

但问题是,当我将complex_struct作为GetData的参数传递时,所有字段都从我身上填充,但不是我的两个simple_struct数组(我的意思是f和h)!! 他们的价值观无效!

谢谢,有人可以帮助我


嗨,谢谢你的回复,

我已经像你说的那样做了,但是当我调用GetData时,我还有另一个问题,进程在没有任何消息的情况下崩溃(一种exception):

这是我的急剧代码:namespace dll_test_import_c_sharp {class Program {[StructLayout(LayoutKind.Sequential,Pack = 1)] struct simple_struct {public int a; public int b; };

  [StructLayout(LayoutKind.Sequential, Pack = 1)] struct complex_struct { public int d; public int e; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public simple_struct[] f; public short g; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public simple_struct[] h; public short i; } ; [DllImport("test_dll.dll", CharSet = CharSet.Unicode)] static extern int GetData(ref complex_struct a); static void Main(string[] args) { complex_struct a = new complex_struct(); GetData(ref a); return; } } } 

我已经做了很多printf我GetData并且所有这些都执行得很好,看起来’return’指令崩溃了!

我试图通过ref或out调用GetData,它们都不起作用……


嗨,谢谢你的回复,

我已经像你说的那样做了,但是当我调用GetData时,我还有另一个问题,进程在没有任何消息的情况下崩溃(一种exception):

这是我的急剧代码:namespace dll_test_import_c_sharp {class Program {[StructLayout(LayoutKind.Sequential,Pack = 1)] struct simple_struct {public int a; public int b; };

  [StructLayout(LayoutKind.Sequential, Pack = 1)] struct complex_struct { public int d; public int e; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public simple_struct[] f; public short g; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public simple_struct[] h; public short i; } ; [DllImport("test_dll.dll", CharSet = CharSet.Unicode)] static extern int GetData(ref complex_struct a); static void Main(string[] args) { complex_struct a = new complex_struct(); GetData(ref a); return; } } } 

我已经做了很多printf我GetData并且所有这些都执行得很好,看起来’return’指令崩溃了!

我试图通过ref或out调用GetData,它们都不起作用……

您需要更改struct上的数组定义以指定它是按值/内联数组

 [StructLayout(LayoutKind.Sequential, Pack = 1)] unsafe struct complex_struct { public int d; public int e; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public simple_struct[] f; public short g; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] public simple_struct[] h; public short i; } ;