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

Pointers 以64位编译时,P/Inovke参数偏移32位,pointers,64-bit,pinvoke,32bit-64bit,Pointers,64 Bit,Pinvoke,32bit 64bit,后续行动。陈腐的问题和我的怀疑是错误的,因此标题和描述是不合适的 我使用p/Unjk调用C++的C++代码。在V64的构建配置中,C和C++项目都是在X64中建立的。当运行这个程序时,P/UncCK调用的参数按照如下的32位移位: C# : |Parameter 1|Parameter 2|Parameter 3|Parameter 4| | | | | | V

后续行动。陈腐的问题和我的怀疑是错误的,因此标题和描述是不合适的

我使用p/Unjk调用C++的C++代码。在V64的构建配置中,C和C++项目都是在X64中建立的。当运行这个程序时,P/UncCK调用的参数按照如下的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位并重新对齐,程序工作正常

有人知道是什么导致了这种奇怪的偏移,以及正确的纠正方法吗

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

丙方:

[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位指针,则可能导致这种偏移情况,但我不确定。< /P> < P>方法名称不应是类实例方法,因为X86世界中的第一字节4,X64 Word中的8将用于非托管世界中的类实例指针。
因此,它应该是静态方法或C风格的方法。

您不应该显示简化版本。魔鬼在于细节:-。此外,MethodName不应该是C++类实例方法,而应该是C类函数。那么它应该是静态方法吗?或者我应该把它从类中分离出来吗?我想静态应该可以工作,因为当有人调用该方法时,第一个参数是指向类实例的指针,所以你需要去掉它。使它静态工作。谢谢西蒙!如果你想转载你的评论作为回答,我会接受的。我相信我在最后一个问题上已经告诉你了!