想必有不少朋友做过 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的调用错误。