我有以下的C ++函数定义,而我试图通过的PInvoke从托管代码调用:
bool FooBar(SIZE_T* arg1);
我管理的声明看起来如下:
[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref uint arg1);
你们有些人可能会注意到同样的错误我最终没有。 这不是64位便携。 SIZE_T是可变的大小(32-64位)因为是指向它的指针的。 在管理的大小的指针正确地转换为64位,但UINT没有,你可以在Arg1的高位垃圾告终。 这是一个特别持久的错误,因为垃圾往往只是零:(
我已经得到了工作的唯一解决方案是以下管理声明:
[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref IntPtr arg1);
这工作当然是因为IntPtr的能正确地改变其大小。 在我的代码我只是治疗的IntPtr为整数,和它的作品,虽然它看起来像一个丑陋的黑客。 在我看来,应该有一些适当的方式,指定这也许使用UnmanagedType.SysUInt,但我一直无法拿出任何其他可行的解决方案。