0

フレームワーク 2 からフレームワーク 4 に移行した後、WriteFile 関数を実行するとエラーが発生します。

[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 パラメータは、umanaged C++ の unsigned long である int32 である必要があります。

元のエラー:

PInvokeStackImbalance が検出されました メッセージ: PInvoke 関数 '' の呼び出しにより、スタックのバランスが崩れました。これは、マネージド PInvoke 署名がアンマネージド ターゲット シグネチャと一致しないことが原因である可能性があります。PInvoke シグネチャの呼び出し規約とパラメーターがターゲットのアンマネージド シグネチャと一致することを確認します。

4

1 に答える 1

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
);
于 2011-06-29T14:12:09.323 に答える