C#のDotNet4アプリで使用しようとしているライブラリがあります。これはbinarayランタイムであるため、ライブラリソースにアクセスできません。エラーが発生します
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 Studio2010Expressを使用しています
PPS私はライブラリの所有者にDllImportsなどを修正する可能な解決策を書いて書いた。マーシャリングレイヤーは問題を回避するはずですが、パフォーマンスにコストがかかる可能性があります。さらに、その紛らわしく、理想的ではありません。ただし、それまでの間、ライブラリが更新されるまでは解決策が必要です。