0

PInvokeバイト配列 to 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 ガベージを受け取ります。

C++ 側を変更せずに、C# パラメーターの前に追加の int を渡すことで、この問題を回避しました。これにより、パラメーターが 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 に答える