我有一个库,我试图在 C# 中与 Dot Net 4 App 一起使用。这是一个二进制运行时,所以我无权访问库源。我收到错误
对 PInvoke 函数 'XXXXXXXXXXX.WinAPI::GetDCEx' 的调用使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
如果我禁用 PInvokeStackImbalance MDA,应用程序将运行,因为它不再被调试器抛出。虽然这解决了应用程序未运行的问题,但显然存在问题。
我最近阅读了有关 NetFx40_PInvokeStackResilience 的内容,您可以在 app.config 中放置一个元素,它告诉运行时使用编组层来检测和修复不正确的平台调用声明(就像以前的 .Net 版本一样)。
<configuration>
<runtime>
<NetFx40_PInvokeStackResilience enabled="1" />
</runtime>
.....
</configuration>
问题是这似乎对调试器没有任何作用,调试器仍然调用错误。
我的问题是我是否还必须禁用 PInvokeStackImbalance MDA?
我怎么知道 NetFx40_PInvokeStackResilience 已经工作并且封送层正在完成它的工作?
PS 我正在使用 Visual Studio 2010 Express
PPS 我已经写信给图书馆的所有者,并提供了修改他的 DllImports 等的可能解决方案。虽然封送层应该解决这个问题,但可能会降低性能。加上它的混乱和不理想。但是,与此同时,在库更新之前,我仍然需要一个解决方案。