web-dev-qa-db-ja.com

.NETでアセンブリバインドエラーログ(Fusion)を有効にする方法

.NETでアセンブリバインドエラーログ(Fusion)を有効にする方法

761
user32736

以下の値を追加します。

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion 
追加:
 DWORD ForceLogの値を1に設定
 DWORD LogFailuresの値を1に設定
 DWORD LogResourceBinds設定値to 1 
 DWORD EnableLog値を1 
に設定文字列LogPathログ用フォルダへの設定値(例:C:\ FusionLog \)

フォルダー名の後にバックスラッシュ を含め、 フォルダーが存在することを確認してください

実行しているプログラムを再起動して、それらのレジストリ設定を読み取らせる必要があります。

ところで、不要なときはフュージョンログをオフにすることを忘れないでください。

800
Gary Kindel

私は普段はFusion Log Viewer( Fuslogvw.exe スタートメニューのVisual StudioコマンドプロンプトまたはFusion Log Viewerから)を使用します。

  • 管理者としてFusion Log Viewerを開く
  • 設定 をクリック
  • カスタムログパスを有効にする チェックボックスをオンにします。
  • ログの書き込み先の場所を入力します。たとえば、c:\FusionLogs 重要: ファイルシステム内にこのフォルダを実際に作成したことを確認してください)。
  • 正しいレベルのロギングがオンになっていることを確認します(私は時々 すべてのバインドをディスクに記録する を選択して正しく動作するようにします)
  • _ ok _ をクリック
  • ログの場所オプションを Custom に設定します。

完了したら、ログオフすることを忘れないでください。

(私はちょうどこれを同様の質問に投稿しました - 私もそれがここでも関連していると思います。)

247
Mike Goatly

お使いのマシンにWindows SDKがインストールされている場合は、Microsoft SDK\Toolsの下に "Fusion Log Viewer"が表示されます(VistaまたはWindows 7/8のスタートメニューに "Fusion"と入力するだけ)。起動して「設定」ボタンをクリックし、「バインド失敗を記録する」または「すべてのバインドを記録する」を選択します。

これらのボタンが無効になっている場合は、スタートメニューに戻り、ログビューアを右クリックして[管理者として実行]を選択します。

186
Samuel Jack

次のレジストリ値を設定します。

[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エクスプローラからファイルを実行し、起こりうる損傷に関する警告を無視してください。

83
user32736

この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
66
Tereza Tomcova

フュージョンログ設定ビューアチェンジャースクリプト は、これを行うための最良の方法です。

ASP.NET では、これを正しく動作させるのが難しい場合があります。このスクリプトはうまく機能し、 Scott HanselmanのPower Toolリスト にもリストされていました。私は個人的に何年もそれを使ってきました、そしてそれは決して私を失望させませんでした。

19

醜いログファイルを使用する代わりに、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データがあります。

Fusion events in PerfView

11
magicandre1981

他人を助けるかもしれないほんのわずかな情報。あるディレクトリ内のすべてのアセンブリでクラス/インタフェースを継承/実装するクラスを検索するという行に沿って何かをする場合、自分のアセンブリの1つに関連するこのエラーが発生した場合は、古いアセンブリを削除してください。

シナリオは次のようになります。

  1. アセンブリAはあるフォルダ内のすべてのアセンブリをロードします
  2. このフォルダのアセンブリBは古くなっていますが、アセンブリCを参照しています
  3. アセンブリCは存在しますが、アセンブリBが古くなってから名前空間、クラス名、またはその他の詳細情報が変更された可能性があります(私の場合、名前空間はリファクタリングプロセスによって変更されました)。

要するに、A ---ロード - > B(失効)---参照---> C

この場合、エラーメッセージに表示される唯一の記号は名前空間とクラス名です。よく調べてください。ソリューションのどこにも見つからない場合は、古いアセンブリをロードしようとしている可能性があります。

3
andrerav

すでにログ記録を有効にしていても、Windows 7 64ビットでこのエラーが発生する場合は、IIS 7.5で試してください。

  1. 新しいアプリケーションプールを作成する

  2. このアプリケーションプールの詳細設定に移動します

  3. 32ビットアプリケーションを有効にする True に設定します。

  4. この新しいプールを使用するようにWebアプリケーションを設定します。

2
Adam Mendoza

念のために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

1

私の場合は小文字でタイプディスク名を助けた

間違った - C:\ someFolder

正しい - c:\ someFolder

0
Vlad

私の Tweet about - Fusion ++ はScott Hanselman自身からリツイートされたので、私はそれについて十分に自信を持っていると思います。

私は Fusion ++という(改善可能な)アセンブリバインディングログビューアを書き、それをGitHub に置きました。

私はあなたとここにいる何人かの訪問者がそれを使って価値のある生涯の分を節約できることを願っています。

Fusion++

0
Waescher

少し怠け者の方は、いつでも有効にしたい場合に備えて、これを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
0
Igor Meszaros