似乎有多种方法可以做到这一点,但我尝试过的例子对我不起作用。
我在某处读到使用不安全的指针将是需要指针的更复杂结构的方法。(对不起,我再也找不到源了)
我最近的尝试是这样的:
unsafe public struct ComplexStruct {
public Int32 NumSubStruct;
public SubStruct*[] arr;
}
unsafe public static extern UInt32 DLL_Call(ref ComplexStruct p);
function {
unsafe {
ComplexStruct p = new ComplexStruct();
p.NumSubStruct = 2;
p.arr= new SubStruct*[p.NumSubStruct];
SubStruct p1 = new SubStruct();
SubStruct p2 = new SubStruct();
p.arr[0] = &p1;
p.arr[1] = &p2;
testLogHandlerHandle = DLL_Call(ref p);
}
}
我收到一条错误消息,指出无法封送 SubStruct(签名不兼容互操作)。
是否可以在不编组的情况下传递对象?(DLL 应该加载到与 C# 应用程序相同的进程空间中)。
如果没有,传递对象副本的最简单方法是什么?
注意:更改 DLL 不是问题。我隐约知道一些其他的解决方案,例如C++/CLI,但我只有相对较少的结构类型需要以这种方式传递。
编辑: 一些注意事项:
- 数组需要通过动态
实际的结构有点复杂(有 4 层像这样的嵌套结构),所以我认为添加它们会影响问题,但为了完整起见,我将在 C++ 中声明它们:
struct ComplexStruct { unsigned int NumSubStruct; SubStruct** arr; }; struct SubStruct { unsigned int NumSubStruct; //some more datamembers here as well SubSubStruct** arr; };
(不需要额外的间接,但我认为能够将 SubStruct 指针数组声明为 IntPtrs 可能很有用)