次の方法で共有


loadFromContext MDA

この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。

loadFromContextマネージド デバッグ アシスタント (MDA) は、アセンブリがLoadFrom コンテキストに読み込まれた場合にアクティブ化されます。 この状況は、 Assembly.LoadFrom またはその他の同様のメソッドを呼び出した結果として発生する可能性があります。

Symptoms

一部のローダー メソッドを使用すると、アセンブリが LoadFrom コンテキストに読み込まれる可能性があります。 このコンテキストを使用すると、シリアル化、キャスト、依存関係の解決で予期しない動作が発生する可能性があります。 一般に、これらの問題を回避するために、アセンブリを Load コンテキストに読み込むことをお勧めします。 この MDA なしでアセンブリが読み込まれたコンテキストを特定するのは困難です。

原因

一般に、グローバル アセンブリ キャッシュや AppDomainSetup.ApplicationBase プロパティなど、Load コンテキスト外のパスから読み込まれたアセンブリは、LoadFrom コンテキストに読み込まれました。

Resolution

LoadFrom呼び出しが不要になるようにアプリケーションを構成します。 これを行うには、次の手法を使用できます。

  • アセンブリをグローバル アセンブリ キャッシュにインストールします。

  • AppDomainApplicationBase ディレクトリにアセンブリを配置します。 既定のドメインの場合、 ApplicationBase ディレクトリは、プロセスを開始した実行可能ファイルを含むディレクトリです。 また、アセンブリを移動するのが便利でない場合は、新しい AppDomain を作成する必要もあります。

  • 依存アセンブリが実行可能ファイルに関連する子ディレクトリにある場合は、アプリケーション構成 (.config) ファイルまたはセカンダリ アプリケーション ドメインへのプローブ パスを追加します。

いずれの場合も、 Assembly.Load メソッドを使用するようにコードを変更できます。

ランタイムへの影響

MDA は CLR に影響しません。 これは、読み込み要求の結果として使用されたコンテキストを報告します。

アウトプット

MDA は、アセンブリが LoadFrom コンテキストに読み込まれたことを報告します。 アセンブリの単純な名前とパスを指定します。 また、 LoadFrom コンテキストの使用を回避するための軽減策も提案します。

コンフィギュレーション

<mdaConfig>
  <assistants>
    <loadFromContext />
  </assistants>
</mdaConfig>

次のコード例は、この MDA をアクティブ化できる状況を示しています。

using System.Reflection;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // The following call caused the LoadFrom context to be used
            // because the assembly is loaded using LoadFrom and the path is
            // located outside of the Load context probing path.
            Assembly.LoadFrom(@"C:\Text\Test.dll");
        }
    }
}

こちらも参照ください