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

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

将以下值添加到

 HKEY_LOCAL_MACHINE \ SOFTWARE \微软\融合
加:
 DWORD ForceLog将值设置为1
 DWORD LogFailures将值设置为1
 DWORD LogResourceBinds设置值为1
 DWORD EnableLog设置值为1
stringLogPath设置日志文件夹的值(例如C:\ FusionLog \)

确保在文件夹名称和文件夹存在包含反斜杠

您需要重新启动您运行的程序来强制它读取这些registry设置。

顺便说一下,不要忘记在不需要时closures融合注销。

我通常使用Fusion Log Viewer(从Visual Studio命令提示符下的Fuslogvw.exe或从开始菜单中的Fusion Log Viewer) – 我的标准设置是:

  • 打开Fusion日志查看器
  • 点击设置
  • 选中启用自定义日志pathcheckbox
  • input您想要写入日志的位置,例如c:\FusionLogs重要提示:确保您已经在文件系统中创build了该文件夹。)
  • 确保正确的日志级别是打开的(我有时只是select“将所有绑定logging到磁盘” ,以确保正确的工作)
  • 点击OK
  • 将日志位置选项设置为自定义

记住一旦完成就closures注销!

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

如果您的计算机上安装了Windows SDK,则可以在Microsoft SDK \ Tools下find“Fusion Log Viewer”(只需在Vista或Windows 7/8的开始菜单中键入“Fusion”即可)。 启动它,单击设置button,然后select“日志绑定失败”或“logging所有绑定”。

如果这些button被禁用,请返回到开始菜单,右键单击日志查看器,然后select“以pipe理员身份运行”。

设置以下registry值:

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

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

将以下文本保存到Windowsregistry编辑器格式的文件中,例如FusionEnableLog.reg:

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion] "EnableLog"=dword:00000001 

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

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

和这一个禁用:

 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日志设置查看器更改脚本是没有最好的办法做到这一点。

在ASP.NET中 ,有时要使这个工作正常工作非常棘手。 这个脚本很好用,也被列在Scott Hanselman的Power Tool列表中。 我已经使用了很多年了,永远不会让我失望。

打开使用GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword关键字(0x4)的DotnetRuntime Private提供程序( Microsoft-Windows-DotNETRuntimePrivate ),也可以通过ETW / xperf激活Fusion日志,上。

 @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表时,可以findFusion数据:

PerfView中的融合事件

只是一点信息可能帮助别人; 如果你在某些目录中searchinheritance/实现类/接口的类的所有程序集,那么确保清除过时的程序集(如果遇到与你自己的程序集有关的错误)。

这种情况会是这样的:

  1. Assembly A将所有程序集加载到某个文件夹中
  2. 在这个文件夹中的组件B是陈旧的,但引用程序集C
  3. 程序集C存在,但是自程序集B变旧(在我的情况下,通过重构过程更改了名称空间),名称空间,类名或其他某些细节可能已经更改了。

简而言之:A —负荷 – > B(陈旧)—参考—> C

如果发生这种情况,唯一的迹象是错误消息中的名称空间和类名。 仔细检查。 如果在解决scheme的任何地方都找不到它,那么您可能试图加载一个陈旧的程序集。

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

  1. 创build一个新的应用程序池

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

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

  4. 指出您的Web应用程序使用这个新的池