none
偵測到 PInvokeStackImbalance錯誤訊息.... RRS feed

  • 問題

  • 請問下列程式的寫法在C# .NET Framework3.5時可以正常執行,但在.NET Framework 4.0時卻會發生後面的錯誤訊息,請問各位先進有什麼解法?

    [DllImport("kernel32.dll")]
    public static extern long GetDriveType(string driveLetter);
    [DllImport("kernel32.dll")]
    public static extern long GetVolumeInformation(string strPathName,
                                                           StringBuilder strVolumeNameBuffer,
                                                           long lngVolumeNameSize,
                                                           long lngVolumeSerialNumber,
                                                           long lngMaximumComponentLength,
                                                           long lngFileSystemFlags,
                                                           StringBuilder strFileSystemNameBuffer,
                                                           long lngFileSystemNameSize);

    錯誤訊息.....

    偵測到 PInvokeStackImbalance
    Message: 對 PInvoke 函式 'ALA Sport!ALA_Sport.Mp3Form::GetVolumeInformation' 的呼叫已使堆疊失去平衡。這可能是因為 Managed PInvoke 簽章和 Unmanaged 目標簽章不相符。請確認 PInvoke 簽章的呼叫慣例及參數與目標 Unmanaged 簽章是否相符。

     

    2010年7月30日 上午 08:29

解答

  • Hi,

    手邊沒有裝VS2010能幫你試

    但您可以參閱PInvokeStackImbalance了解例外發生原因

    PInvokeStackImbalance

    當 CLR 偵測到平台叫用 (Invoke) 之後的堆疊深度,不符合由 DllImportAttribute 屬性 (Attribute) 指定之呼叫慣例 (Calling Convention) 所提供的預期堆疊深度,以及 Managed 簽章 (Signature) 中的參數宣告時,PInvokeStackImbalanceManaged 偵錯助理 (MDA) 就會啟動。

     


    平台叫用呼叫的 Managed 簽章,可能不符合所要叫用之方法的 Unmanaged 簽章。這種不符合可能是因為 Managed 簽章未宣告正確的參數數目,或是未對參數指定適當大小所造成的。當呼叫慣例 (可能由 DllImportAttribute 屬性指定) 不符合 Unmanaged 呼叫慣例時,這個 MDA 也會啟動。

     

    也可以參閱Managed Debugging Assistants (MDA's)這篇下面討論提到的宣告方式看看

    Managed Debugging Assistants (MDA's)

     

     


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 Lolota Lee 2010年8月6日 上午 08:30
    2010年7月31日 上午 02:02
  • 這邊也有可能的錯誤原因,

    提供給您參考一下:

    Kernel32.DLL Error Troubleshooting


    小中中的學習筆記
    • 已標示為解答 Lolota Lee 2010年8月6日 上午 08:30
    2010年8月6日 上午 03:49

所有回覆

  • Hi,

    手邊沒有裝VS2010能幫你試

    但您可以參閱PInvokeStackImbalance了解例外發生原因

    PInvokeStackImbalance

    當 CLR 偵測到平台叫用 (Invoke) 之後的堆疊深度,不符合由 DllImportAttribute 屬性 (Attribute) 指定之呼叫慣例 (Calling Convention) 所提供的預期堆疊深度,以及 Managed 簽章 (Signature) 中的參數宣告時,PInvokeStackImbalanceManaged 偵錯助理 (MDA) 就會啟動。

     


    平台叫用呼叫的 Managed 簽章,可能不符合所要叫用之方法的 Unmanaged 簽章。這種不符合可能是因為 Managed 簽章未宣告正確的參數數目,或是未對參數指定適當大小所造成的。當呼叫慣例 (可能由 DllImportAttribute 屬性指定) 不符合 Unmanaged 呼叫慣例時,這個 MDA 也會啟動。

     

    也可以參閱Managed Debugging Assistants (MDA's)這篇下面討論提到的宣告方式看看

    Managed Debugging Assistants (MDA's)

     

     


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 Lolota Lee 2010年8月6日 上午 08:30
    2010年7月31日 上午 02:02
  • [DllImport("kernel32.dll")]

    public static extern long GetVolumeInformation(string strPathName,
                                                           StringBuilder strVolumeNameBuffer,
                                                           long lngVolumeNameSize,
                                                           long lngVolumeSerialNumber,
                                                           long lngMaximumComponentLength,
                                                           long lngFileSystemFlags,
                                                           StringBuilder strFileSystemNameBuffer,
                                                           long lngFileSystemNameSize);

    上述是你自己寫的嗎?

    改做如下試看看:

    [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    extern static bool GetVolumeInformation(
     string RootPathName,
     StringBuilder VolumeNameBuffer,
     int VolumeNameSize,
     out uint VolumeSerialNumber,
     out uint MaximumComponentLength,
     out FileSystemFeature FileSystemFlags,
     StringBuilder FileSystemNameBuffer,
     int nFileSystemNameSize);
    

    參考來源: http://www.pinvoke.net/default.aspx/kernel32.getvolumeinformation


    ASP.NET 2Share - http://www.dotblogs.com.tw/johnny
    2010年8月1日 下午 04:58
  • 各位先進,小弟試了一下,小弟在VS2010功能表的偵錯->例外狀況->Managed Debugging Assistants->PInvokeStaticImbalance的擲回選項取消掉就可以正常執行了, 試起來也很正常, 不曉得這樣會不會有什麼問題?

    2010年8月2日 上午 05:40
  • Hi,

    您有試著換過宣告方式嗎?

    這種把例外訊息關掉的做法感覺沒辦法時再採用會比較好


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    2010年8月4日 上午 04:40
  • 這邊也有可能的錯誤原因,

    提供給您參考一下:

    Kernel32.DLL Error Troubleshooting


    小中中的學習筆記
    • 已標示為解答 Lolota Lee 2010年8月6日 上午 08:30
    2010年8月6日 上午 03:49