次の方法で共有


loadFromContext MDA

Note

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

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

現象

一部のローダー メソッドは、使用すると、LoadFrom コンテキストでアセンブリが呼び出される結果になる可能性があります。 このコンテキストを使用すると、シリアル化、キャスティング、依存関係の解決について予期しない結果になる可能性があります。 一般的に、このような問題を回避するために、アセンブリを Load コンテキストに読み込むことをお勧めします。 この MDA を使用せずに、アセンブリが読み込まれたコンテキストを判断することは困難です。

原因

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

解決方法

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

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

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

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

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

ランタイムへの影響

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

出力

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");
        }
    }
}

関連項目