提问



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

最佳参考


添加以下值


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\)


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


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


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

其它参考1


我通常使用Fusion Log Viewer(来自Visual Studio命令提示符的Fuslogvw.exe或开始菜单中的Fusion Log Viewer) - 我的标准设置是:[10]



  • 以管理员身份打开Fusion Log Viewer

  • 点击设置

  • 选中启用自定义日志路径复选框

  • 输入您希望日志写入的位置,例如c:\FusionLogs(重要:确保您已在文件系统中实际创建了此文件夹。)

  • 确保启用了正确的日志记录级别(我有时只选择记录所有绑定到磁盘,只是为了确保一切正常)

  • 点击确定

  • 将日志位置选项设置为自定义



一旦你完成了,请记得关闭注销!


(我刚刚在类似的问题上发布了这个问题 - 我认为这也是相关的。)

其它参考2


如果您的计算机上安装了Windows SDK,您将在Microsoft SDK \\ Tools下找到Fusion Log Viewer(只需在Vista或Windows 7/8的开始菜单中键入Fusion)。启动它,单击设置按钮,然后选择日志绑定失败或记录所有绑定。


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

其它参考3


设置以下注册表值:


[[HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Fusion!EnableLog]](DWORD)为1


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


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


Windows Registry Editor Version 5.00

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


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

其它参考4


您可以以管理员身份运行此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

其它参考5


Fusion日志设置查看器更改器脚本是最好的方法。 [11]


在ASP.NET中,有时让它正常工作一直很棘手。这个剧本很有效,并且也列在Scott Hanselman的电动工具列表中。我已经亲自使用它多年了,它永远不会让我失望。[12] [13]

其它参考6


您也可以通过使用GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword关键字(0x4)打开DotnetRuntime私有提供程序(Microsoft-Windows-DotNETRuntimePrivate),而不是使用丑陋的日志文件,通过ETW/xperf激活Fusion日志上。[14]


@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数据:[15]


[16]

其它参考7


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


场景将是这样的:



  1. 程序集A加载某个文件夹中的所有程序集

  2. 此文件夹中的程序集B过时,但引用程序集C

  3. 程序集C存在,但命名空间,类名或其他一些细节可能在程序集B过时后已经过去的时间内发生了变化(在我的情况下,通过重构过程更改了名称空间)



简而言之:A ---加载 - > B(陈旧)---参考---> C.


如果发生这种情况,唯一的标志是错误消息中的命名空间和类名。仔细检查。如果你无法在解决方案的任何地方找到它,你可能会尝试加载过时的程序集。

其它参考8


如果您已经启用了日志记录,并且在Windows 7 64位上仍然出现此错误,请在IIS 7.5中尝试:



  1. 创建新的应用程序池

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

  3. 将启用32位应用程序设置为 True

  4. 指向您的Web应用程序以使用此新池