提问人:user32736 提问时间:11/1/2008 最后编辑:Peter Mortensenuser32736 更新时间:10/16/2022 访问量:563195
如何在 .NET 中启用程序集绑定失败日志记录 (Fusion)
How to enable assembly bind failure logging (Fusion) in .NET
答:
设置以下注册表值:
[HKEY_LOCAL_MACHINE\软件\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 资源管理器运行该文件并忽略有关可能损坏的警告。
评论
将以下值添加到
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\)
请确保在文件夹名称后包含反斜杠,并且文件夹存在。
您需要重新启动正在运行的程序,以强制它读取这些注册表设置。
顺便说一句,不要忘记在不需要时关闭融合日志记录。
评论
如果您的计算机上安装了Windows SDK,您将在Microsoft SDK\Tools下找到“Fusion Log Viewer”(只需在Vista或Windows 7/8的开始菜单中键入“Fusion”)。启动它,单击“设置”按钮,然后选择“记录绑定失败”或“记录所有绑定”。
如果这些按钮被禁用,请返回开始菜单,右键单击日志查看器,然后选择“以管理员身份运行”。
评论
我通常使用Fusion Log Viewer(Visual Studio命令提示符下的Fuslogvw.exe或开始菜单中的Fusion Log Viewer) - 我的标准设置是:
- 以管理员身份打开 Fusion Log Viewer
- 点击“设置”图标
- 选中启用自定义日志路径复选框
- 输入要写入日志的位置,例如,(重要提示:请确保您确实已在文件系统中创建此文件夹。
c:\FusionLogs
- 确保打开了正确的日志记录级别(我有时只是选择“将所有绑定记录到磁盘”,以确保一切正常)
- 单击“确定”
- 将日志位置选项设置为“自定义”
完成后,请记住关闭注销!
(我刚刚发布了一个类似的问题 - 我认为它在这里也很重要。
评论
fuslogvw
TargetFrameworkSDKToolsDirectory
Fusion Log Settings Viewer更改器脚本是执行此操作的最佳方法。
在 ASP.NET 中,有时很难让它正常工作。这个脚本效果很好,也被列入了 Scott Hanselman 的 Power Tool 列表。我个人已经使用它多年了,它从未让我失望。
评论
如果您已经启用了日志记录,但在 Windows 7 64 位上仍然收到此错误,请在 IIS 7.5 中尝试以下操作:
创建新的应用程序池
转到此应用程序池的“高级设置”
将“启用 32 位应用程序”设置为“true”
将 Web 应用程序指向使用此新池
只是一点点可能对他人有帮助的信息;如果按照在某个目录中搜索所有程序集以查找继承/实现类/接口的类的思路执行某些操作,则请确保在收到与自己的程序集之一相关的错误时清除过时的程序集。
场景如下:
- 程序集 A 加载某个文件夹中的所有程序集
- 此文件夹中的程序集 B 已过时,但引用了程序集 C
- 程序集 C 存在,但命名空间、类名或其他一些细节可能在程序集 B 过时后的时间里发生了变化(在我的例子中,命名空间是通过重构过程更改的)
简而言之:A ---loads--> B(陈旧)---引用---> C
如果发生这种情况,唯一的明显标志是错误消息中的命名空间和类名。仔细检查它。如果在解决方案中的任何位置都找不到它,则可能是在尝试加载过时的程序集。
除了使用丑陋的日志文件外,还可以通过 ETW/xperf 激活 Fusion 日志,方法是打开 DotnetRuntime 专用提供程序 () 和 GUID 和关键字 (0x4)。Microsoft-Windows-DotNETRuntimePrivate
763FD754-7086-4DFE-95EB-C01A46FAF4CA
FusionKeyword
@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 数据:
评论
你可以以管理员身份运行此 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
评论
以防万一您想知道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 工具\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
评论
对于那些有点懒惰的人,我建议在你想启用它时将其作为 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
程序集绑定日志查看器(FUSLOGVW.exe)有很多问题,我决定编写一个名为Fusion++的替代查看器并将其放在GitHub上。它在内部使用相同的机制,但会为您解析日志。您根本不需要关心任何设置,甚至不需要日志路径 😉
您可以从此处或通过 chocolatey () 获取最新版本。choco install fusionplusplus
我希望你和这里的一些游客可以用它来节省一些有价值的终生时间。
这不是一个答案,而是一个警告:
- 如果您曾经启用此日志记录,请不要忘记禁用它,否则您以后会后悔的。
我确实忘记了,我最终在文件夹中得到了几 GB 的扩展名小日志文件——它显然记录了在帐户下运行的应用程序的所有程序集绑定。HTM
C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\IE
NT AUTHORITY\SYSTEM
文件数量大于 300 万,Total Commander 和 Windows 资源管理器都无法在不挂起的情况下显示内容或文件夹大小。
在禁用日志记录并重新启动以达到良好措施后,我从命令提示符运行删除。
删除三星 970 Pro SSD 上的所有文件花了 15 分钟多的时间,该 SSD 一直显示 100% 的磁盘使用率——我的高端 PC 工作站被这次删除操作打倒在地,直到完成才保持部分响应。
评论
fuslogvw.exe