我从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。