15

AutoCAD 2009 のアドオンを開発しています。プロジェクトの出力はクラス ライブラリです。クラス ライブラリをデバッグしてロードしようとすると、「LoaderLock が検出されました」というメッセージが表示されます。私はしばらくの間、これらのアドオンを書いてきましたが、これは私が見たこのタイプの最初のメッセージです。

  1. これを理解するには、どこから始めればよいでしょうか。
  2. LoaderLock とは何ですか? なぜ今それが気になっているのですか?

LoaderLock が検出されました メッセージ: OS ローダー ロック内でマネージ実行を試みています。アプリケーションがハングする可能性があるため、DllMain またはイメージ初期化関数内でマネージ コードを実行しようとしないでください。

に行ってDebug -> Exceptions -> "Managed Debugging Assistants"、チェックボックスを見つけ"LoaderLock"てチェックを外しました"Thrown"

もう一度デバッグすることはできますが、何をし、なぜそれをしなければならなかったのですか? これにより、他の問題が発生しますか?

4

3 に答える 3

17

ローダー ロックは、プロセス アドレス空間への DLL のロードへのアクセスを同期するためにシステムによって使用されるプロセス全体のロックです。DLL をロードする関数、DLL を解放する関数、DLL 情報を照会する関数などはすべて、ローダー ロックを取得します。通常、開発者に最も大きな影響を与えるのは、DllMain の実行中にローダー ロックが保持されることです。これは、コードの実行中に通常は認識されていない OS ロックが保持される可能性があることを意味します。

ローダー ロックは、ロック階層の非常に低いレベルにあると見なすことができます。DllMain 中にローダー ロックの下で実行されているコードは、デッドロックの原因になる可能性があります。たとえば、CLR には、DLL のロード中に保持できる独自の内部ロック セットがあります。DllMain 内からマネージ コードを呼び出すと、スレッドの CLR がローダー ロックを保持している間に、これらのロックのいずれかを取得する可能性があります。別のスレッドの CLR がそのロックを取得し (DllMain の元のスレッドがブロックされる)、ローダー ロックを取得する DLL を読み込もうとすると、プロセスがデッドロックします。

CLR は、ローダー ロックの下で実行中のマネージド コードをプリエンプティブに検出しようとしているようです。デバッガーでこのエラーのスタックを確認したら、マネージ コードが DllMain 内から実行されている原因を特定し、それを削除します。

于 2009-05-20T19:33:35.287 に答える
3

AutoCAD での私の経験では、LoaderLock 警告は無視しても問題ありません。これは、コードが間違っていることを示すものではなく、AutoCAD がアプリケーションをロードして初期化する方法が原因で警告が発生します。

于 2009-05-20T20:04:14.350 に答える
1

これはVisualStudio2005のバグです。詳細については、次の記事をお読みください:http ://support.microsoft.com/kb/913996

于 2011-12-29T07:43:21.323 に答える