0

最新のHDF5DotNetラッパー(1.8.7)に更新しようとしていますが、次の警告が表示されます(VS2010からDEBUGモードで実行している場合)。

PInvokeStackImbalanceが検出されましたメッセージ:PInvoke関数'HDF5DotNet!:: H5Fopen'の呼び出しにより、スタックのバランスが崩れました。これは、マネージドPInvokeシグニチャがアンマネージドターゲットシグニチャと一致しないことが原因である可能性があります。PInvokeシグニチャの呼び出し規約とパラメータがターゲットのアンマネージドシグニチャと一致することを確認してください。

コンパイル済みのバイナリ(.NET Framework 4.0 32ビット用のHDF5DotNetアセンブリ)を使用していますが、ソースからコンパイルしたときに同じ結果が得られました。

不思議なことに、HDF5DotNetラッパーを非DEBUGモードで呼び出すアプリケーションを実行すると、問題は発生しません。1.8.6と1.8.7の間で、すべての呼び出し規約がCdeclからStdCallに切り替えられたことに気づきました。これが原因でしょうか?CallingConventionはCdeclであるべきだと言っている他のフォーラムを見たことがあります...

ありがとう!

4

1 に答える 1

2

stdcallはい、またはその逆で関数を呼び出すcdeclと、スタックの不均衡が発生します。これらの規則の主な違いはcdecl呼び出し元がスタックから引数を削除する責任があり、stdcallが呼び出し先が責任を負うことです。

リリースモードでも同じバグがあると思います。ただし、一部のランタイムチェックが無効になっているため、エラーは発生しません。間違った呼び出し規約を使用すると、ほとんどの場合、ネイティブプログラムがクラッシュしますが、.net相互運用コードには、この問題を隠す、より堅牢なスタック処理があるようです。

于 2011-05-26T22:25:38.013 に答える