2


0

32ビットアプリケーションでのみ、配列を渡すためにref myarray [0]を使用するのはなぜですか(間違って)?

ある相互運用(「DllImport」を使用)で愚かなことを一度に行いましたが、それでも32ビットマシンで動作しました。

方法1の動作が異なる64ビットアプリケーションで何が異なる(そしてなぜ?)

方法1(間違った方法):

ref byte param   //Signature of `DllImport`ed function
ref myarray[0]   //Parameter passed in when calling function

方法2(正しい方法):

byte[] param   //Signature of `DllImport`ed function
myarray        //Parameter passed in when calling function

いずれにせよ、インポートされた関数が最終的に見るアドレスは、最初の配列要素のアドレスが何であれなければなりません。 配列はメモリ内で連続して割り当てられるため、これらの2つの方法は同等であると予想されていました。

アプリケーションはCPUタイプ「Any」用にコンパイルされました。 32ビットマシンでは、方法1と方法2の両方が機能し、期待どおりに動作しました。 64ビットマシンでは、方法2のみが正しく機能しました。 方法1では、アプリケーションは配列の最初の要素しか見ることができませんでした。 アレイの残りの部分はゼロになりました。

2 Answer


3


64ビットフレームワークは、関数呼び出しの前に一時ストレージ領域にコピーし、関数の終了後にそのデータを元の「ref」パラメーターにコピーして戻す場合があります。


0


私の推測では、あなたはDLL自体の異なるバージョンをロードしているだろう…​ 64ビットアプリケーションは、x86として実行するときにロードされたのと同じ32ビットバージョンのdllをロードできないため、別のdllを指す必要があります。 dllの64ビットバージョンは、異なる方法でパラメーターを処理する必要があります。

どのDLLを読み込んでいますか? WinSxsによって処理されるものでしょうか?