跟进PInvoke 字节数组以 char 在 64 位中无法正常运行。(陈旧的问题和我的怀疑是错误的,因此标题和描述不合适)。
我正在使用 P/Invoke 从 C# 调用 C++ 代码。我在 VS 的构建配置中将 C# 和 C++ 项目设置为在 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,garbage。
我通过在 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 位指针,那可能会导致这种偏移情况,但我不确定。