PInvoke字节数组char在64位中表现不正常

时间:2013-09-13 21:54:54

标签: c# char byte pinvoke marshalling

我从C#调用C ++代码,通过字节数组作为参数。这个C ++代码执行几何碰撞,当我用32位编译所有内容时,它的行为正常。当我用64位编译所有内容时,我会得到零星的行为,有时是正确的,有时是不正确的。

C#方:

[DllImport(@"C:\FullPath\CppCode.dll", EntryPoint = "GeomCompare")]
private static extern bool GeomCompare(byte[] data1, byte[] data2);

C ++方面:

extern "C" __declspec(dllexport)
bool CppClass::GeomCompare(unsigned char *data1, unsigned char *data2)

在64位中,有时,当我在不同的场合从C#代码传递相同的byte []时(在c#端,byte []总是处于相同的状态),它偶尔会从C ++中看作null有时它读得很好。其他时候,当从byte []读取时,C ++会获得AccessViolationException。

奇怪的是当我用32位编译这个DLL时,它运行得很好。我怀疑在64位编组时可能会有一些奇怪的东西,但我没有找到任何东西。

编辑:
在使用4个整数对虚函数进行一些测试之后,我发现当我到达C ++端时,我的参数在内存中都被偏移了32位。

示例:

C# : |Parameter 1|Parameter 2|Parameter 3|Parameter 4|
           |           |           |           |           |
           V           V           V           V           V
C++:             |Parameter 1|Parameter 2|Parameter 3|Parameter 4|

似乎所有数据都向下移动了32位,因此接收参数1,2,3,4,C ++收到参数2,3,4,垃圾。

我通过在C#端的其余参数前面传入一个垃圾整数来解决这个问题,而不更改C ++代码来纠正这个32位偏移量。现在,当从C#代码调用时,这可以正常工作。

但是,在我的最终利用中,我必须从SQL的CLR集成函数中调用此C#代码。无论有没有这种解决方法,我都会从SQL中获取AccessViolationExceptions。

0 个答案:

没有答案