.NET アセンブリ バインド ログ:その他の有効化方法と詳細
.NET アプリケーションで特定のアセンブリの読み込みに失敗した場合、その原因を特定するのに役立つのが、アセンブリのバインド失敗ロギング (Fusion) です。既定では無効になっているため、有効にする方法を説明します。
方法 1: レジストリによる有効化
- レジストリエディタを起動します (管理者権限が必要です)
- 以下のキーに移動します:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
- "EnableLog" という名前の DWORD (32ビット) 値が存在しなければ、新規作成します。
- "EnableLog" の値を "1" に設定します。
方法 2: Fusion Log Viewer (fuslogvw.exe) を使用した有効化
- Windows SDK がインストールされている場合、"Microsoft SDK\Tools" フォルダ内に "Fusion Log Viewer" (fuslogvw.exe) があります (スタートメニューから "Fusion" で検索できます)
- Fusion Log Viewer を起動します。
- "設定" ボタンをクリックします。
- 以下のオプションの中から目的のものを選択します。
- "バインドの失敗をログに出力する": バインドに失敗したアセンブリのみをログに出力します。
- "すべてのアセンブリのバインドをログに出力する": すべてのアセンブリのバインド処理をログに出力します (パフォーマンスに影響が出る可能性があります)
ログの確認
有効化後、アセンブリの読み込みに失敗すると、ログが生成されます。ログを確認するには、以下の手順で行います。
- ログ一覧が表示されますので、そこから詳細を確認できます。
注意点
- ロギングを有効にすると、パフォーマンスに若干の影響が出る場合があります。
- ロギングを終了したい場合は、レジストリの "EnableLog" の値を "0" に戻すか、Fusion Log Viewer でロギングを無効化してください。
.NET アセンブリ バインド ログ:コード例と解説
.NET アセンブリのバインド失敗ログ (Fusion ログ) は、アプリケーションの実行時にアセンブリの読み込みが失敗した場合、その原因を特定するために非常に役立ちます。
ここでは、コードから Fusion ログを有効にする 方法と、ログの内容を読み解く 上で役立つ情報を提供します。
コードから Fusion ログを有効にする
.NET Framework 4.5 以降では、コードから Fusion ログの設定を変更することができます。
using System;
using System.Diagnostics;
namespace FusionLogExample
{
class Program
{
static void Main(string[] args)
{
// Fusion ログを有効にする
AppDomain.CurrentDomain.FirstChanceException += (sender, e) =>
{
if (e.Exception is FileNotFoundException)
{
// アセンブリが見つからない場合、Fusion ログを有効にする
FusionLog.SetLogPath(@"C:\temp\fusionlogs");
}
};
// アセンブリの読み込みを試す(例)
try
{
// 存在しないアセンブリを読み込む
Assembly.Load("NonExistentAssembly");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
- AppDomain.CurrentDomain.FirstChanceException イベント: アプリケーションドメイン内で例外が発生した際に最初に呼び出されるイベントです。
- FusionLog.SetLogPath メソッド: Fusion ログの出力先を指定します。
- FileNotFoundException: アセンブリが見つからない場合に発生する例外です。
解説:
- FirstChanceException イベントにハンドラーを追加し、FileNotFoundException が発生した場合に FusionLog.SetLogPath を呼び出すことで、特定の状況下でのみ Fusion ログを有効にすることができます。
- SetLogPath メソッドで指定したパスにログファイルが生成されます。
Fusion ログの内容を読み解く
Fusion ログには、アセンブリの検索パス、バインドポリシー、エラーメッセージなど、バインド処理に関する詳細な情報が記録されます。
- ログファイルの場所: 上記のコード例では、
C:\temp\fusionlogs
フォルダにログファイルが生成されます。 - 重要な情報:
- バインド要求: どのアセンブリが要求されたか
- 検索パス: アセンブリが検索されたパス
- バインドポリシー: バインドに適用されたポリシー
- エラーメッセージ: バインド失敗の原因となったエラーメッセージ
.NET アセンブリのバインド失敗ログは、アセンブリの読み込みに関する問題を解決する上で非常に強力なツールです。
- レジストリ設定 または Fusion Log Viewer を使用してグローバルに有効化
- コードから 特定の状況下で有効化
- ログファイルの内容を解析 し、問題の原因を特定
注意:
- ログファイルは、システムの動作によっては非常に大きくなることがあります。
- ログファイルの解析には、.NET のアセンブリバインディングの知識が必要です。
- Fuslogvw.exe: Fusion ログを視覚的に確認するためのツールです。
- トレース: より詳細な情報を取得するために、トレースを使用することもできます。
さらに詳しく知りたい方へ
- Microsoft Learn: Fuslogvw.exe (アセンブリ バインディング ログ ビューアー)
- Pistolfly: .NETでアセンブリバインドのエラーログを有効にするには
構成ファイル (app.config, web.config) による設定: アプリケーションの構成ファイルに以下の要素を追加することで、特定のアプリケーションに対して Fusion ログを有効化できます。
<configuration> <runtime> <assemblyBinding> <dependentAssembly> <assemblyIdentity name="YourAssemblyName" publicKeyToken="..." culture="neutral" /> <bindingRedirect oldVersion="..." newVersion="..." /> <codeBase version="..." href="..." /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
bindingRedirect
やcodeBase
要素を用いて、アセンブリの検索パスやバージョンのリダイレクトを設定できます。- これらの設定は、Fusion ログに詳細な情報を記録させるのに役立ちます。
トレース: .NET Framework には、トレース機能が組み込まれており、より詳細な情報を取得できます。トレースの設定は、
System.Diagnostics.Trace
クラスを使用します。Trace.Listeners.Add(new TextWriterTraceListener("mytrace.log")); Trace.AutoFlush = true; Trace.WriteLine("Starting application...");
- トレースは、Fusion ログよりも詳細な情報を提供しますが、設定が複雑になる場合があります。
ログ内容の分析
- ログファイルの場所:
- レジストリ設定で指定したパス
- アプリケーションの出力ディレクトリ
- ユーザーのローカルなログディレクトリ
- ログファイルの内容:
- タイムスタンプ
- イベントの種類 (バインド開始、バインド成功、バインド失敗など)
- アセンブリ名
- バージョン
- カルチャ
- 公開キートークン
- 検索パス
- エラーメッセージ
- 分析ツール:
- Fuslogvw.exe: ログファイルの閲覧と検索に便利なツール
- カスタムツール: ログファイルを解析するためのカスタムツールを作成することも可能
問題解決への応用
- アセンブリが見つからない:
- 検索パスが正しいか確認
- 構成ファイルの設定が正しいか確認
- アセンブリ名が正しいか確認
- バージョンが合わない:
- バインドリダイレクトの設定を確認
- アセンブリのバージョンが正しいか確認
- 強名前署名:
- 依存関係:
.NET アセンブリのバインド失敗ログは、アプリケーションのトラブルシューティングに不可欠なツールです。適切な設定とログの分析により、問題の原因を迅速かつ正確に特定することができます。
- パフォーマンス: Fusion ログを有効にすることで、パフォーマンスが若干低下する場合があります。
- セキュリティ: ログファイルには、アプリケーションに関する機密情報が含まれる可能性があるため、適切なアクセス制御が必要です。
- .NET Core/5: .NET Core/5 以降では、ログの出力方法や設定が異なる場合があります。
c# .net vb.net