跟进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位指针,那可能会导致这种偏移情况,但我不确定。
答案 0 :(得分:1)
MethodName
不应该是类实例方法,因为第一个字节(x86世界中的4个,x64世界中的8个)将用于非托管世界中的类实例指针。
因此,它应该是静态方法(或C风格方法)。