次の方法で共有


bindingFailure MDA

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

アセンブリの読み込みに失敗すると、 bindingFailure マネージド デバッグ アシスタント (MDA) がアクティブになります。

Symptoms

コードは、静的参照またはローダー メソッドの 1 つ ( Assembly.LoadAssembly.LoadFromなど) を使用してアセンブリを読み込もうとしました。 アセンブリが読み込まれず、 FileNotFoundException または FileLoadException 例外がスローされます。

原因

バインド エラーは、ランタイムがアセンブリを読み込むことができない場合に発生します。 バインディングエラーは、次のいずれかの状況の結果である可能性があります。

  • 共通言語ランタイム (CLR) は、要求されたアセンブリを見つけることができません。 アセンブリがインストールされていない、アプリケーションがアセンブリを検索するように正しく構成されていないなど、この問題が発生する理由は多数あります。

  • 一般的な問題のシナリオは、型を別のアプリケーション ドメインに渡すことです。CLR では、その型を含むアセンブリを他のアプリケーション ドメインに読み込む必要があります。 他のアプリケーション ドメインが元のアプリケーション ドメインと異なる方法で構成されている場合、ランタイムがアセンブリを読み込めない場合があります。 たとえば、2 つのアプリケーション ドメインの BaseDirectory プロパティ値が異なる場合があります。

  • 要求されたアセンブリが破損しているか、アセンブリではありません。

  • アセンブリを読み込もうとしているコードには、アセンブリを読み込む正しいコード アクセス セキュリティアクセス許可がありません。

  • ユーザー資格情報は、ファイルを読み取るために必要なアクセス許可を提供しません。

Resolution

最初の手順は、CLR が要求されたアセンブリにバインドできなかった理由を判断することです。 ランタイムが見つからなかったり、要求されたアセンブリを読み込めなかったりする理由は多数あります。たとえば、「原因」セクションに記載されているシナリオなどです。 バインドエラーの原因を排除するには、次のアクションをお勧めします。

  • bindingFailure MDA によって提供されるデータを使用して、原因を特定します。

    • Fuslogvw.exe (アセンブリ バインド ログ ビューアー) を実行して、アセンブリ バインダーによって生成されたエラー ログを読み取ります。

    • アセンブリが要求された場所にあるかどうかを確認します。 LoadFromおよびLoadFileメソッドの場合、要求された場所を簡単に特定できます。 アセンブリ ID を使用してバインドする Load メソッドの場合は、アプリケーション ドメインの BaseDirectory プロパティ プローブ パスとグローバル アセンブリ キャッシュでその ID に一致するアセンブリを検索する必要があります。

  • 上記の決定に基づいて原因を解決します。 考えられる解決オプションは次のとおりです。

    • 要求されたアセンブリをグローバル アセンブリ キャッシュにインストールし、そのアセンブリを呼び出します。 Load ID でアセンブリを読み込むメソッド。

    • 要求されたアセンブリをアプリケーション ディレクトリにコピーし、 Load メソッドを呼び出して、ID でアセンブリを読み込みます。

    • BaseDirectory プロパティを変更するか、プライベート プローブ パスを追加して、バインド エラーが発生したアプリケーション ドメインを再構成してアセンブリ パスを含めます。

    • ログオンしているユーザーがファイルを読み取ることができるように、ファイルのアクセス制御リストを変更します。

ランタイムへの影響

この MDA は CLR には影響しません。 バインドエラーに関するデータのみを報告します。

アウトプット

MDA は、要求されたパスや表示名、バインド コンテキスト、読み込みが要求されたアプリケーション ドメイン、失敗の理由など、読み込みに失敗したアセンブリを報告します。

CLR でデータを使用できなかった場合は、表示名または要求されたパスが空白になる可能性があります。 失敗した呼び出しが Load メソッドに対して行われた場合、ランタイムがアセンブリの表示名を特定できなかった可能性があります。

コンフィギュレーション

<mdaConfig>
  <assistants>
    <bindingFailure />
  </assistants>
</mdaConfig>

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

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // This call attempts to load a nonexistent assembly.
            // The call will throw a System.IO.FileNotFound exception
            // and cause the activation of the bindingFailure MDA
            // if it is registered.
            Assembly.Load("NonExistentAssembly");
        }
    }
}

こちらも参照ください