2011-06-29 97 views
0

當我從Framework 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參數應該是一個INT32,這是一個無符號長在 umanaged C++。

原始錯誤:

檢測PInvokeStackImbalance 消息:一個調用的PInvoke函數 '' 具有不平衡堆棧。這很可能是因爲託管的PInvoke簽名與非託管目標籤名不匹配。檢查PInvoke簽名的調用約定和參數是否與目標非託管簽名相匹配。

+1

這不是問題。 – Puppy

+1

大衛釘了它。您的代碼失敗,因爲VS2010中的默認平臺目標設置從AnyCPU更改爲x86,將指針大小從8字節更改爲4字節。顯然你從來沒有在32位版本的Windows上調試過。無法保證客戶機器上的故障,它往往意外工作。使用FileStream.Write()取而代之將是明智的。 –

回答

1

lpOverlapped是一個指針,你應該聲明它爲IntPtrref參數。

您正在運行一個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這是否回答你的問題? –

相關問題