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


818

.NETでアセンブリバインドエラーログ(Fusion)を有効にするにはどうすればよいですか?


46
誰かが気になっている場合は、フュージョンロガー(fuslogvw.exe)を使用するには、次の記事を読んで ください

13
@意志-共有してくれてありがとう!おまけとして、fuslogvw.exe権利の問題を回避するために、管理者として実行してください。
SliverNinja-MSFT 2012年

13
@fuslogvwのインストールが「最良の」答えであることには同意しませんか。開発環境ではない可能性のあるものにWindows SDK全体をインストールする必要がなく、ツールだけを入手できる場合は、ポイントがあります。
コクシー

2
@Willもちろんですが、あなたがリンクする回答はそれをカバーしていません。
Coxy

8
@ウィルそれについてあまり子供っぽくしないでください。あなたは有用ですが、コミュニティは他の人よりも役に立たないと判断した回答を促進することによって担当者を集めようとしている人です。
Coxy

回答:


868

次の値を

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
追加:
DWORD ForceLogの値を1に設定
DWORD LogFailuresは値を1に設定します
DWORD LogResourceBindsが値を1に設定
DWORD EnableLogに値を1に設定
文字列LogPathは、ログのフォルダーに値を設定します(例:C:\ FusionLog \)

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

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

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

ここに画像の説明を入力してください


23
Garyのソリューションは私にとってはうまくいきましたが、IISをリセットすることも必要でした。これは、SDKなどをインストールしたくないクリーンな環境で構成したことに注意してください。
Michhes、2010

5
レジストリの変更がすぐに反映されないという報告がいくつかありました。Fusionのログをオンにしてから再起動してみましたか?
Gary Kindel

54
レジストリ設定を読み取るには、実行中のプログラムを再起動する必要があります
Orion Edwards

50
Fusion Log Viewerがすべてを行います。[スタート]-> [プログラム]-> [Visual Studio xxxx]> [Visual Studioツール]> [Visual Studioコマンドプロンプト(管理者として実行)]に移動し、「fuslogvw」と入力します。設定でログを調整します。
r3mark 2013年

10
便利なロギングをオン/オフにするために、.regファイルを作成しました。これは、Gary Kindelの回答(有効無効化)に基づいています。
Igor Kustov 2013年

271

私は通常の融合ログビューアを使用(Fuslogvw.exeではをからのVisual Studioコマンドプロンプトスタートメニューから、または融合ログビューア) -私の標準設定は次のとおりです。

  • 管理者としてFusion Log Viewerを開きます
  • 設定をクリック
  • [ カスタムログパスを有効にする]チェックボックスをオンにします
  • たとえば、ログを書き込む場所を入力しますc:\FusionLogs重要:このフォルダーがファイルシステムに実際に作成されていることを確認してください)。
  • ログの適切なレベルがオンになっていることを確認します(場合によっては、正常に機能していることを確認するために、[すべてのバインドをディスクに記録する]を選択することもあります)。
  • OKをクリックします
  • ログの場所オプションをカスタムに設定します

完了したら、必ずログオフをオフにしてください!

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


4
ネイティブアプリケーションから自分でランタイムをホストしている場合、何らかの理由でカスタムログパスを使用する必要があることに注意してください。そうしないと、何もログに記録されません。
jpierson 2012年

少なくとも私の状況では、実際にカスタムログパスを設定する必要はありませんでした。設定ダイアログで「すべてのバインドをディスクに記録する」など、ログをオンにするだけで済みました。
Josh

42
私の場合、管理者として実行する必要がありました。それ以外の場合は、すべてのオプションが無効になっています。
vezenkov

2
注:Adminとしてフォルダーを作成してください!
Tabrock

6
fuslogvw管理者としてだけでなく、例外をスローしているVisual Studioプロジェクトが使用している正しい Windows SDKパスからも実行していることを確認してください。そのcsprojを確認し、SDKを検索します(私のsdkノードの名前はですTargetFrameworkSDKToolsDirectory)。一致しないfuslogvwバージョンを使用すると、例外がキャッチされないようです(これは理にかなっています...)
Veverke

191

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

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


6
これらのボタンは無効になっています-なぜですか?
Tim Lovell-Smith

14
@Tim、これまで見たことがない-管理者権限と関係があるのでしょうか?結局変更されているのはHKEY_LOCAL_MACHINEです。
サミュエルジャック、

2
「設定、バインド失敗のログ」は私の問題を見つけるのに十分でした。
pauloya 2011

1
フォルダに書き込みアクセスが許可されていることを確認してください。UACとc:\ logsがFusionログでうまく機能しない
Edward Wilde

4
注意点として、ボタンが無効になっている場合は、管理者権限でFusion Log Viewerを再実行してください。
ブルーノロペス2013年

86

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

[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エクスプローラーからファイルを実行し、破損の可能性に関する警告を無視します。


4
エントリがおそらく存在しないわけではありません-作成する必要があります。少なくとも、今朝クラッシュする直前にこの質問に答えようとしていたとき、私はそうしました:)
Jon Skeet

3
とは!平均?キーまたは値?64ビットシステムはどうですか?
ブルーノマルティネス

48
実際には、これは機能します。機能させるには、iisreset後書きを実行する必要があります。
Nick DeMayo 2010年

4
@Norman:この特定の設定は、Asp.Netエラーがアセンブリページのエラーメッセージをエラーページに表示するために使用されるため、ログをファイルに保存するためではありません。@OP:+1。.regファイルを含めるように編集されました。!フォーマットは、答えを探すためにこのページに私を送ったエラーメッセージを除いて、私が見たことがないものです。
ブライアン

2
IISをリセットする必要はありません。関連するアプリケーションプールのみです。または、少なくともそれが私がする必要があったすべてでした。
ケニーエビット2015年

81

この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
mkdir C:\FusionLog -Force

これを無効にする:

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

4
ありがとう!私は自分のコマンドをこの要点に入れることを許可しました。そしてc:\FusionLog、人々がそれを忘れないようにディレクトリの作成を追加しました;-)
Oliver

コマンドラインのルール!「カットアンドペースト」と呼ばれるこれまでに開発された最高のコード再利用技術を使用して、これをすばやく再生できました。ありがとう。
RemigijusPankevičius19年1

20

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

ではASP.NET、これが正常に動作させるために時にはトリッキーされています。このスクリプトはうまく機能し、Scott HanselmanのPower Toolリストにもリストされました。私は何年もの間それを個人的に使用しており、決して失望させることはありません。


ps実行後に無効にするか、このフォルダが非常に大きくなる可能性があることを確認してください
Adam Tuliper-MSFT

これが、私がETWを使用して、本当に必要な場合にのみデータをログに記録する理由です。
magicandre1981 2015

13

醜いログファイルを使用する代わりに、GUID とキーワード(0x4)をオンにしてDotnetRuntime Privateプロバイダー()をオンにすることにより、ETW / xperf経由でFusionログをアクティブ化することもできMicrosoft-Windows-DotNETRuntimePrivateます。763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword

@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データが見つかります。

PerfViewのFusionイベント


@YuriBondarchukこれによりオンデマンドでアクティブになり、ETLに多くのデータ(他のプロセス、fileversionデータ)が含まれるため、他のユーザーにファイルを提供でき、通常のフュージョンログと比較してはるかに多くの情報を取得できます
magicandre1981

12

Fusion ++という名前のアセンブリバインディングログビューアを作成して、GitHubに配置しました

ここから、またはChocolatey(choco install fusionplusplus)から最新のリリースを入手できます。

あなたとここの訪問者の何人かが、それによって価値ある一生の時間を節約できることを願っています。

Fusion ++


1
親愛なる先生、あなたは神です!
Sylvain Girard

1
それは素晴らしいツールです、どうもありがとう!
simoneL

3

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

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

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

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

  4. この新しいプールを使用するようにWebアプリケーションをポイントする


男、あなたは私の日を救います、私は問題を解決するのに約8時間かかりました。どうもありがとう。:)
Dika Arta Karunia

3

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

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

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

つまり、A --- loads-> B(stale)--- references ---> C

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


3

少し怠惰な人のために、これを有効にしたいときのために、これを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

FusionLog.exeの場所について疑問に思っている場合に備えて-持っていることはわかっていますが、見つかりませんか?過去数年、何度も何度もFUSLOVWを探していました。.NET 4.5への移行後、FUSION LOGのバージョンの数が急増しました。彼女は、インストールしたソフトウェアに応じて、ディスク上で見つけることができる場所です。

C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools \ x64

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 Tools

C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools

C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin


0

私の場合、小文字でディスク名を入力するのに役立ちました

間違った - C:\ someFolder

正解 -c:\ someFolder

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.