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

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

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

我使用p/UnjCK调用C++中的C++代码。在V64的构建配置中,我既有在C 64中建立的C项目,也有C++项目,当运行这个程序时,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位并重新对齐,程序工作正常

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

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

C侧:

C++方面:

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

我怀疑,由于参数被关闭了32位,可能在64位中没有正确执行某些操作。也许在调用方法时,在变量之前传递了一个隐式指针?如果这只是C 32方上的一个64位指针,而C++是期望一个64位指针,那么这可能会导致这种偏移情况,但是我不确定。

<代码>方法> < /> >不应该是类实例方法,因为第一个字节(x86世界中的8,x64 World中的8)将被用于非托管世界中的类实例指针。
因此,它应该是静态方法(或C风格的方法)。

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