在我的C代码中,我有一个包含许多未知大小数组的结构体,在一个非托管dll(C代码)中。我需要将这个结构体的一个实例的数据转换为C#,稍后再将其发送回非托管C代码。
一旦到达C#,我不需要操作这些数据,只需持有它/存储它一段时间(因此它可以保留在一个字节数组中)。
我不想使用关键字“unsafe”,因为这是一个大项目,而这只是一个小片段,我不想那样编译。
我尝试将其作为lpArray进行转换,一切看起来都很好,但当我查看返回C#之后的内容时,它总是为空。这种类型的转换方式对于各种类型的动态数组都适用,但不适用于结构体。
在网上搜索未果,更复杂的情况比我的还要多,但如果有人见过这样的链接,请在这里发布,我会非常感激!
谢谢。
-更新:下面是我的代码大致结构:
C#:
一旦到达C#,我不需要操作这些数据,只需持有它/存储它一段时间(因此它可以保留在一个字节数组中)。
我不想使用关键字“unsafe”,因为这是一个大项目,而这只是一个小片段,我不想那样编译。
我尝试将其作为lpArray进行转换,一切看起来都很好,但当我查看返回C#之后的内容时,它总是为空。这种类型的转换方式对于各种类型的动态数组都适用,但不适用于结构体。
在网上搜索未果,更复杂的情况比我的还要多,但如果有人见过这样的链接,请在这里发布,我会非常感激!
谢谢。
-更新:下面是我的代码大致结构:
C#:
[DllImport("mydll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int W_Thread_Connect_NET(
[MarshalAs(UnmanagedType.LPStr, SizeConst = 100)] string IPAddress,
int DevicePort,
[MarshalAs(UnmanagedType.LPArray)] byte[] connectionHandle
);
//and call it like this, with an empty struc to be populated by c (can this be done? it is comming back without the data):
byte[] myStrucParam= new byte[100];
int result = W_Thread_Connect_NET(myStrucParam, myParam1, myParam2, ...);
c:
typedef struct myStructDef{
char* myArray1,
char* myArray2,
int myInt1,
...
} mystrucObj, *pMystrucObj;
//method that i am wanting to marshal the struct as a paramter here..
MYDLL_DLLIMPORT int APIENTRY W_Thread_Connect_NET(pMystrucObj strucReturn_handle, char * IPAddress, int DevicePort, ...)
{
//(omitted)
}