[英]P/Invoke marshaling and unmarshalling 2D array, structure and pointers between C# and unmanaged DLL
[英]Passing structure containing an array of structures between C and C# (DLL and P invoke)
我有一个复杂的结构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中有一个函数GetData(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时仍然有另一个问题,进程崩溃而没有任何消息(一种异常):
这是我的急剧代码: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时仍然有另一个问题,进程崩溃而没有任何消息(一种异常):
这是我的急剧代码: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;
} ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.