想必有不少朋友做過 WinForm 下的 ReportViewer 應用,在功能打印和導出PDF時會遇到一個異常:
檢測到 PInvokeStackImbalance
Message: 對 PInvoke 函數“Microsoft.ReportViewer.Common!Microsoft.ReportingServices.Rendering.ImageRenderer.CompositionPDF+WindowsGDIWrapper::GetGlyphIndicesW”的調用導致堆棧不對稱。原因可能是托管的 PInvoke 簽名與非托管的目標簽名不匹配。請檢查 PInvoke 簽名的調用約定和參數與非托管的目標簽名是否匹配。
關于這個問題,MS語焉不詳,而其它通過修改DLL引用方法的方式對于 Microsoft.ReportViewer.Common 和 Microsoft.ReportViewer.WinForms 也是無能為力。
在網上搜,發現也有很多人遇到這個問題。
用了一個友網的辦法:
測試程序時發現,這個問題總是在調試時發生,而程序發布之后,這個問題就不再出現了。
做了幾個小測試,發現,刪除 xxxxxx.pdb (在可執行程序目錄刪除所有的 *.pdb)(放置ReportViewer控件的)后,測試就可以順利通過,
問題解決了,探討原因:調試宿主的簽名與程序簽名不一致,致使某些異常發生,引發這個DLL的調用錯誤。