【发布时间】:2012-05-10 19:10:39
【问题描述】:
似乎有多种方法可以做到这一点,但我尝试过的示例对我不起作用。
我在某处读到,使用不安全指针将是处理需要指针的更复杂结构的方法。 (对不起,我再也找不到源了)
我最近的尝试是这样的:
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 可能很有用)
【问题讨论】:
-
你能展示这两个结构的 C++ 声明吗?我个人非常怀疑
unsafe是要走的路。 -
额外的间接性会伤害你。没有它会更容易。
-
最后,您使用不安全的方式没有得到答案。这可能会有所帮助:stackoverflow.com/questions/17549123/…
标签: c# pinvoke marshalling dllimport unsafe