none
PInvoke StackImBlance的問題。 RRS feed

  • 問題

  • OS: XP SP3

    IDE: VS2010 Framework4.0

    問題是這樣子的

    VC6寫的DLL,其簽名碼如下:

    DLL_API int B32(int Device, int BitNo);

    .Net中的宣告如下:

    [DllImport(DllName, CharSet = CharSet.Auto, EntryPoint = "B32")]
      public static extern int B32(int Device, int BitNo);

    每次在IDE裡用debug模式執行,一呼叫到這個,就會出現PInvoke StackImBlance的錯誤。但直接去執行執行檔就不會出錯。

    實在看不出有什麼問題。應該說只要在debug模式下,呼叫這個dll就會出現StackImBlance的錯誤。

    以前在VS2008做PInvoke也都這樣子用,也沒出過這種問題。不知是否有什麼需要設定的。謝謝

    訊息如下。

    對 PInvoke 函式 'xx!xxxx::fnInitialize' 的呼叫已使堆疊失去平衡。

    這可能是因為 Managed PInvoke 簽章和 Unmanaged 目標簽章不相符。請確認 PInvoke 簽章的呼叫慣例及參數與目標 Unmanaged 簽章是否相符。


    2011年2月18日 上午 02:39

解答

所有回覆

  • 用VC6寫了一個很簡單的例子

    #ifdef __cplusplus
    extern "C" 
    {
    #endif
     __declspec(dllexport) int fnInitialize(int flag)
     {
      
      return 1;
     } 
    #ifdef __cplusplus
    }
    #endif

    在VS2010中

    [DllImport(DllName, CharSet = CharSet.Auto, EntryPoint = "fnInitialize")]
      public static extern int fnInitialize(int flag);
    int ret = fnInitialize(0);

    這樣一樣在IDE用DEBUG模式執行,一樣會出現Stack ImBlance的問題。

    同樣的作法以前在VS2008不會出現這個訊息。

    2011年2月18日 上午 03:35
  • 來自問自答了

    原來專案中的"啟用 Unmanaged程式碼偵錯"要開啟

     

    • 已標示為解答 Howard_cmit 2011年2月18日 上午 03:54
    2011年2月18日 上午 03:54