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
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文件并查看事件表时,可以找到融合数据:
只是一点可能对其他人有所帮助的信息;如果您在某个目录中搜索所有程序集以查找继承/实现类/接口的类,那么如果您得到与您自己的某个程序集相关的此错误,请确保清除过时的程序集。
这种情况类似于:
简而言之: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