.NETでアセンブリバインドエラーログ(Fusion)を有効にする方法
以下の値を追加します。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion 追加: DWORD ForceLogの値を1に設定 DWORD LogFailuresの値を1に設定 DWORD LogResourceBinds設定値to 1 DWORD EnableLog値を1 に設定文字列LogPathログ用フォルダへの設定値(例:C:\ FusionLog \)
フォルダー名の後にバックスラッシュ を含め、 フォルダーが存在することを確認してください 。
実行しているプログラムを再起動して、それらのレジストリ設定を読み取らせる必要があります。
ところで、不要なときはフュージョンログをオフにすることを忘れないでください。
私は普段はFusion Log Viewer( Fuslogvw.exe スタートメニューのVisual StudioコマンドプロンプトまたはFusion Log Viewerから)を使用します。
c:\FusionLogs
( 重要: ファイルシステム内にこのフォルダを実際に作成したことを確認してください)。完了したら、ログオフすることを忘れないでください。
(私はちょうどこれを同様の質問に投稿しました - 私もそれがここでも関連していると思います。)
お使いのマシンにWindows SDKがインストールされている場合は、Microsoft SDK\Toolsの下に "Fusion Log Viewer"が表示されます(VistaまたはWindows 7/8のスタートメニューに "Fusion"と入力するだけ)。起動して「設定」ボタンをクリックし、「バインド失敗を記録する」または「すべてのバインドを記録する」を選択します。
これらのボタンが無効になっている場合は、スタートメニューに戻り、ログビューアを右クリックして[管理者として実行]を選択します。
次のレジストリ値を設定します。
[HKEY_LOCAL_MACHINE \ソフトウェア\ Microsoft\Fusion!EnableLog](DWORD)を1に
無効にするには、0に設定するか値を削除します。
[編集]:次のテキストをWindowsレジストリエディタフォーマットのファイル、例えばFusionEnableLog.regに保存してください:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001
その後、Windowsエクスプローラからファイルを実行し、起こりうる損傷に関する警告を無視してください。
このPowershellスクリプトを管理者として実行してFLを有効にすることができます。
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLog -Value 1 -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailures -Value 1 -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBinds -Value 1 -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath -Value 'C:\FusionLog\' -Type String
注:LogPathエントリに指定されたディレクトリが存在することを確認してください。ディレクトリが存在しない場合は、ログは取得できません。
そしてこれは無効にする:
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLog
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailures
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBinds
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath
フュージョンログ設定ビューアチェンジャースクリプト は、これを行うための最良の方法です。
ASP.NET では、これを正しく動作させるのが難しい場合があります。このスクリプトはうまく機能し、 Scott HanselmanのPower Toolリスト にもリストされていました。私は個人的に何年もそれを使ってきました、そしてそれは決して私を失望させませんでした。
醜いログファイルを使用する代わりに、GUID Microsoft-Windows-DotNETRuntimePrivate
およびFusionKeyword
キーワード(0x4)をオンにしてDotnetRuntimeプライベートプロバイダ(763FD754-7086-4DFE-95EB-C01A46FAF4CA
)をオンにすることで、 ETW/xperf を使用して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ファイルを開き、Eventsテーブルを見ると、Fusionデータがあります。
他人を助けるかもしれないほんのわずかな情報。あるディレクトリ内のすべてのアセンブリでクラス/インタフェースを継承/実装するクラスを検索するという行に沿って何かをする場合、自分のアセンブリの1つに関連するこのエラーが発生した場合は、古いアセンブリを削除してください。
シナリオは次のようになります。
要するに、A ---ロード - > B(失効)---参照---> C
この場合、エラーメッセージに表示される唯一の記号は名前空間とクラス名です。よく調べてください。ソリューションのどこにも見つからない場合は、古いアセンブリをロードしようとしている可能性があります。
すでにログ記録を有効にしていても、Windows 7 64ビットでこのエラーが発生する場合は、IIS 7.5で試してください。
新しいアプリケーションプールを作成する
このアプリケーションプールの詳細設定に移動します
32ビットアプリケーションを有効にする を True に設定します。
この新しいプールを使用するようにWebアプリケーションを設定します。
念のためにFusionLog.exeの場所について疑問に思っている - あなたはそれを持っていることを知っているが、あなたはそれを見つけることができませんか?私は過去数年間に何度も何度もFUSLOVWを探していました。 .NET 4.5に移行した後、FUSION LOGのバージョン数が爆発しました。あなたがインストールしたソフトウェアに応じて、彼女はそれがあなたのディスク上で見つけられる場所です:
C:¥Program Files(x86)¥Microsoft SDKs¥Windows¥v8.0A¥bin¥NETFX 4.0 Tools¥x 64
C:¥Program Files(x86)¥Microsoft SDKs¥Windows¥v7.0A¥Bin¥x64
C:¥Program Files(x86)¥Microsoft SDKs¥Windows¥v8.1A¥bin¥NETFX 4.5.1 Tools¥x64
C:¥Program Files(x86)¥Microsoft SDKs¥Windows¥v8.0A¥bin¥NETFX 4.0ツール
C:¥Program Files(x86)¥Microsoft SDKs¥Windows¥v8.1A¥bin¥NETFX 4.5.1ツール
C:¥Program Files(x86)¥Microsoft SDKs¥Windows¥v7.0A¥Bin
私の場合は小文字でタイプディスク名を助けた
間違った - C:\ someFolder
正しい - c:\ someFolder
私の Tweet about - Fusion ++ はScott Hanselman自身からリツイートされたので、私はそれについて十分に自信を持っていると思います。
私は Fusion ++という(改善可能な)アセンブリバインディングログビューアを書き、それをGitHub に置きました。
私はあなたとここにいる何人かの訪問者がそれを使って価値のある生涯の分を節約できることを願っています。
少し怠け者の方は、いつでも有効にしたい場合に備えて、これを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