当以64位编译时,P / Inovke参数偏移32位

时间:2013-09-24 14:24:35

标签: pointers 64-bit pinvoke 32bit-64bit

跟进PInvoke byte array to char not behaving properly in 64 bit。 (陈旧的问题和我的怀疑是错误的,因此标题和描述是不合适的。)

我正在使用P / Invoke从C#调用C ++代码。我将C#和C ++项目设置为在VS的构建配置中以x64构建。当我运行这个程序时,P / Invoke调用的参数移位32位,如下所示

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

因此,如果我从C#端传递1,2,3,4,则C ++端会收到2,3,4,垃圾。

我通过在C#参数前面传递一个额外的int而不改变C ++方面来解决这个问题。这将参数偏移32位并重新对齐它们,程序运行良好。

有没有人知道造成这种奇怪偏移的原因以及纠正它的正确方法?

这是一个显示我的方法签名的简化示例

C#方:

[DllImport(@"C:\FullPath\CppCode.dll", EntryPoint = "MethodName",
CallingConvention = CallingConvention.Cdecl))]
private static extern bool MethodName(parameters);

C ++方面:

extern "C" __declspec(dllexport)
bool CppClass::MethodName(parameters)

我怀疑由于参数被32位关闭,可能有些东西在64位中没有真正完成。也许在调用方法时,有一个隐含的指针在变量之前传递?如果那只是C#端的32位指针而且C ++期望64位指针,那可能会导致这种偏移情况,但我不确定。

1 个答案:

答案 0 :(得分:1)

MethodName不应该是类实例方法,因为第一个字节(x86世界中的4个,x64世界中的8个)将用于非托管世界中的类实例指针。

因此,它应该是静态方法(或C风格方法)。