0

跟进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 位指针,那可能会导致这种偏移情况,但我不确定。

4

1 回答 1

1

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

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

于 2013-09-24T17:31:01.357 回答