.NET でアセンブリ バインド エラー ログ (Fusion) を有効にするにはどうすればよいですか?
13 に答える
次の値を追加します
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion 追加: DWORD ForceLog の値を 1 に設定 DWORD LogFailures は値を 1 に設定します DWORD LogResourceBinds は値を 1 に設定します DWORD EnableLog の値を 1 に設定 文字列 LogPath は、ログのフォルダーに値を設定します (例: C:\FusionLog\)
フォルダ名の後にバックスラッシュを含め、フォルダが存在することを確認してください。
これらのレジストリ設定を強制的に読み取るには、実行中のプログラムを再起動する必要があります。
ちなみに、不要な場合はフュージョン ログをオフにすることを忘れないでください。
私は通常、Fusion Log Viewer( VisualStudioコマンドプロンプトからのFuslogvw.exeまたはスタートメニューからのFusionLog Viewer)を使用します-私の標準設定は次のとおりです。
- 管理者としてFusionLogViewerを開きます
- 設定をクリックします
- [カスタムログパスを有効にする]チェックボックスをオンにします
- たとえば、ログを書き込む場所を入力します
c:\FusionLogs
(重要:ファイルシステムにこのフォルダーを実際に作成したことを確認してください)。 - 適切なレベルのログがオンになっていることを確認します(正しく機能していることを確認するために、[すべてのバインドをディスクに記録する]を選択することがあります)
- [ OK]をクリックします
- ログの場所のオプションをカスタムに設定します
完了したら、ログオフをオフにすることを忘れないでください。
(私はこれを同様の質問に投稿しました-ここでも関連があると思います。)
マシンに Windows SDK がインストールされている場合は、Microsoft SDK\Tools の下に「Fusion Log Viewer」があります (Vista または Windows 7/8 のスタート メニューに「Fusion」と入力するだけです)。それを起動し、[設定] ボタンをクリックして、[バインドの失敗をログに記録] または [すべてのバインドをログに記録] を選択します。
これらのボタンが無効になっている場合は、スタート メニューに戻り、ログ ビューアを右クリックして、[管理者として実行] を選択します。
次のレジストリ値を設定します。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion!EnableLog] (DWORD) を 1 に
無効にするには、0 に設定するか、値を削除します。
[編集]:次のテキストを、FusionEnableLog.reg などのファイルに Windows レジストリ エディター形式で保存します。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001
次に、Windows エクスプローラーからファイルを実行し、破損の可能性に関する警告を無視します。
Fusion Log Settings Viewer チェンジャー スクリプトは、これを行う最良の方法ではありません。
ASP.NETでは、これを正しく機能させるのが難しい場合がありました。このスクリプトはうまく機能し、Scott Hanselman の Power Tool リストにも掲載されました。私は個人的に何年もそれを使用してきましたが、決してがっかりすることはありません。
醜いログ ファイルを使用する代わりに、ETW/xperfMicrosoft-Windows-DotNETRuntimePrivate
を介して、GUID763FD754-7086-4DFE-95EB-C01A46FAF4CA
とFusionKeyword
キーワード (0x4) を使用して DotnetRuntime プライベート プロバイダー ( ) を有効にすることにより、Fusion ログを有効にすることもできます。
@echo off
echo Press a key when ready to start...
pause
echo .
echo ...Capturing...
echo .
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -on PROC_THREAD+LOADER+PROFILE -stackwalk Profile -buffersize 1024 -MaxFile 2048 -FileMode Circular -f Kernel.etl
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -start ClrSession -on Microsoft-Windows-DotNETRuntime:0x8118:0x5:'stack'+763FD754-7086-4DFE-95EB-C01A46FAF4CA:0x4:0x5 -f clr.etl -buffersize 1024
echo Press a key when you want to stop...
pause
pause
echo .
echo ...Stopping...
echo .
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -start ClrRundownSession -on Microsoft-Windows-DotNETRuntime:0x8118:0x5:'stack'+Microsoft-Windows-DotNETRuntimeRundown:0x118:0x5:'stack' -f clr_DCend.etl -buffersize 1024
timeout /t 15
set XPERF_CreateNGenPdbs=1
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -stop ClrSession ClrRundownSession
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -stop
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -merge kernel.etl clr.etl clr_DCend.etl Result.etl -compress
del kernel.etl
del clr.etl
del clr_DCend.etl
PerfViewでETL ファイルを開き、イベント テーブルの下を見ると、Fusion データを見つけることができます。
少し面倒な人には、これを有効にしたいときは常にこれをbatファイルとして実行することをお勧めします:
reg add "HKLM\Software\Microsoft\Fusion" /v EnableLog /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v ForceLog /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v LogFailures /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v LogResourceBinds /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v LogPath /t REG_SZ /d C:\FusionLog\
if not exist "C:\FusionLog\" mkdir C:\FusionLog
他の人に役立つかもしれないほんの少しの情報。クラス/インターフェイスを継承/実装するクラスのディレクトリ内のすべてのアセンブリを検索する行に沿って何かを行う場合、独自のアセンブリの1つに関連するこのエラーが発生した場合は、古いアセンブリを必ず消去してください。
シナリオは次のようになります。
- アセンブリ A は、あるフォルダー内のすべてのアセンブリをロードします
- このフォルダー内のアセンブリ B は古いですが、アセンブリ C を参照しています
- アセンブリ C は存在しますが、名前空間、クラス名、またはその他の詳細は、アセンブリ B が古くなってから経過した時間内に変更された可能性があります (私の場合、名前空間はリファクタリング プロセスによって変更されました)。
要するに: A ---loads--> B (古い) ---references---> C
これが発生した場合、唯一の兆候は、エラー メッセージ内の名前空間とクラス名です。よく調べてください。ソリューションのどこにも見つからない場合は、古いアセンブリを読み込もうとしている可能性があります。
すでにログを有効にしていて、Windows 7 64ビットでこのエラーが発生する場合は、IIS7.5でこれを試してください。
新しいアプリケーションプールを作成する
このアプリケーションプールの詳細設定に移動します
[ 32ビットアプリケーションを有効にする]をTrueに設定します
この新しいプールを使用するようにWebアプリケーションを指定します