关于c#:如何在.NET中启用程序集绑定失败日志记录(Fusion)

How to enable assembly bind failure logging (Fusion) in .NET

如何在.NET中启用程序集绑定失败日志记录(Fusion)?


将以下值添加到

1
2
3
4
5
6
7
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
Add:
DWORD ForceLog set value to 1
DWORD LogFailures set value to 1
DWORD LogResourceBinds set value to 1
DWORD EnableLog set value to 1
String LogPath set value to folder for logs (e.g. C:\FusionLog\)

确保在文件夹名称后包含反斜杠,并且文件夹存在。

您需要重新启动正在运行的程序,以强制它读取这些注册表设置。

顺便说一句,不要忘记在不需要的时候关闭融合日志记录。


我通常使用Fusion日志查看器(Visual Studio命令提示符中的fuslogvw.exe或"开始"菜单中的fusion日志查看器)-我的标准设置是:

  • 以管理员身份打开Fusion日志查看器
  • 单击设置
  • 选中启用自定义日志路径复选框
  • 输入要写入日志的位置,例如,c:\FusionLogs(重要提示:确保已在文件系统中实际创建了此文件夹。)
  • 确保日志记录的级别是正确的(有时我只是选择Log all binds to disk,以确保一切正常工作)。
  • 单击确定
  • 将日志位置选项设置为自定义

完成后请记住关闭注销!

(我刚刚在一个类似的问题上发布了这个消息——我认为这也与此相关。)


如果您的计算机上安装了Windows SDK,您将在Microsoft SDK ools下找到"Fusion日志查看器"(只需在Vista或Windows 7/8的"开始"菜单中键入"Fusion")。启动,点击设置按钮,选择"日志绑定失败"或"日志所有绑定"。

如果禁用了这些按钮,请返回"开始"菜单,右键单击日志查看器,然后选择"以管理员身份运行"。


设置以下注册表值:

[hkey_local_machinesoftwaremicrosoftfusion!启用日志(dword)到1

要禁用,请设置为0或删除该值。

[编辑]:将以下文本保存到文件中,例如fusionnablelog.reg,在Windows注册表编辑器格式:

1
2
3
4
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001

然后从Windows资源管理器运行该文件,忽略有关可能损坏的警告。


您可以以管理员身份运行此PowerShell脚本以启用fl:

1
2
3
4
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条目提供的目录存在。如果目录不存在,则无法检索日志。

这一个要禁用:

1
2
3
4
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


Fusion Log Settings Viewer Changer脚本是执行此操作的最佳方法。

在ASP.NET中,要使其正常工作有时很困难。这个脚本工作得很好,并被列在斯科特汉塞尔曼的电动工具清单上。我个人用了好几年,从来没有让我失望过。


您也可以通过etw/xperf激活Fusion日志,而不是使用丑陋的日志文件,方法是打开guid 763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword关键字(0x4)的dotNetRuntime专用提供程序(Microsoft-Windows-DotNETRuntimePrivate)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@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 events in PerfView


只是一点可能对其他人有所帮助的信息;如果您在某个目录中搜索所有程序集以查找继承/实现类/接口的类,那么如果您得到与您自己的某个程序集相关的此错误,请确保清除过时的程序集。

这种情况类似于:

  • 程序集A加载某个文件夹中的所有程序集
  • 此文件夹中的程序集B已过时,但引用了程序集C
  • 程序集C存在,但自程序集B过时以来,名称空间、类名或某些其他详细信息可能在经过的时间内发生了更改(在我的示例中,名称空间是通过重构过程更改的)。
  • 简而言之:A---加载--->B(过时)---引用--->C

    如果发生这种情况,唯一的信号就是错误消息中的名称空间和类名。仔细检查。如果在解决方案中的任何位置都找不到它,则可能是在尝试加载过时的程序集。


    如果已启用日志记录,但在Windows 7 64位上仍然出现此错误,请在IIS 7.5中尝试此操作:

  • 创建新的应用程序池

  • 转到此应用程序池的高级设置

  • 将启用32位应用程序设置为true

  • 指向Web应用程序以使用此新池


  • 以防万一你想知道fusionlog.exe的位置-你知道你有,但你找不到?在过去的几年里,我一次又一次地寻找富斯洛夫。在移到.NET 4.5之后,融合日志的版本号已爆炸。她是可以在磁盘上找到它的位置,具体取决于您安装的软件:

    C:程序文件(x86)Microsoft SDKWindowsV8.0Ainetfx 4.0工具x64

    C:程序文件(x86)Microsoft SDKWindowsV7.0Ainx64

    C:程序文件(x86)Microsoft SDKWindowsV8.1ainetfx 4.5.1工具x64

    C:Program Files(x86)Microsoft SDKWindowsV8.0Ainetfx 4.0工具

    C:程序文件(x86)Microsoft SDKWindowsV8.1ainetfx 4.5.1工具

    C:程序文件(x86)Microsoft SDKWindowsV7.0Ain


    在我的例子中,帮助输入小写的磁盘名

    错误-c:somefolder

    正确-c:somefolder