2011-06-29 24 views
0

フレームワーク2からフレームワーク4に移行した後、WriteFile関数を実行するとエラーが発生します。WriteFile kernel32.dllでPInvokeStackImbalanceが検出されました

[DllImport("kernel32.dll")] 
     public static extern bool WriteFile(SafeHandle hFile, 
      byte[] lpBuffer, 
      uint nNumberOfBytesToWrite, 
      out uint lpNumberOfBytesWritten, 
      long lpOverlapped); 

対処:

[DllImport("kernel32.dll")] 
     public static extern bool WriteFile(SafeHandle hFile, 
      byte[] lpBuffer, 
      uint nNumberOfBytesToWrite, 
      out uint lpNumberOfBytesWritten, 
      **Int32** lpOverlapped); 

lpOverlappedパラメーターは にunsigned long型は、C++をumanagedさINT32であるべきです。

オリジナルエラー:

PInvokeStackImbalanceが検出されました

メッセージ:のPInvokeの関数 'への呼び出しは、' スタックをアンバランスがあります。これは、管理対象のPInvokeシグネチャがアンマネージ対象シグネチャと一致しないためです。 PInvokeシグネチャの呼び出し規約とパラメータが、対象となる管理されていないシグネチャと一致することを確認します。

+1

これは質問ではありません。 – Puppy

+1

ダビデはそれを打ちました。 VS2010のデフォルトのプラットフォームターゲット設定がAnyCPUからx86に変更され、ポインタサイズが8バイトから4バイトに変更されたため、コードが失敗しました。明らかに、これは32ビットバージョンのWindowsでデバッグしたことはありません。お客様の機械の故障は保証されていません。偶発的に作動する傾向があります。代わりにFileStream.Write()を使用することは賢明です。 –

答えて

1

lpOverlappedはポインタであり、IntPtr、またはrefパラメータとして宣言する必要があります。

ポインタが予想されたときに、以前は32ビットプロセスを実行していて、以前は64ビット整数longを渡していました。新しいバージョンの.netランタイムがエラーを検出します。

解決策は、最も確実にパラメータをInt32と宣言しないことです。 64ビットのターゲットにコンパイルすると間違っています。

重複したI/Oを使用していないように見えるので、IntPtrを使用し、IntPtr.Zeroを渡します。

[DllImport("kernel32.dll")] 
static extern bool WriteFile(
    IntPtr hFile, 
    byte[] lpBuffer, 
    uint nNumberOfBytesToWrite, 
    out uint lpNumberOfBytesWritten, 
    IntPtr lpOverlapped 
); 
+0

@Miguelこれはあなたの質問に答えますか? –

関連する問題