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

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

答案

将以下值添加到

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 Log Viewer( Visual Studio 命令提示符下的 Fuslogvw.exe或开始菜单中的 Fusion Log Viewer)- 我的标准设置是:

  • 以管理员身份打开 Fusion Log Viewer
  • 点击设置
  • 选中启用自定义日志路径复选框
  • 输入您要写入日志的位置,例如c:\FusionLogs重要:请确保已在文件系统中实际创建了此文件夹。)
  • 确保启用了正确级别的日志记录(有时我只是选择 “ 记录所有绑定到磁盘只是为了确保一切正常”)
  • 点击确定
  • 将日志位置选项设置为 “ 自定义”

完成后,请记住要关闭注销!

(我只是将其发布在一个类似的问题上 - 我认为这也很重要。)

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

如果禁用了这些按钮,请返回到开始菜单,右键单击 Log Viewer,然后选择 “以管理员身份运行”。

设置以下注册表值:

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

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

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

Windows Registry Editor Version 5.00

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

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

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

Fusion Log Settings Viewer更改器脚本并不是最好的方法。

ASP.NET 中 ,有时很难使其正常工作。该脚本的效果很好,并且在Scott Hanselman 的 Power Tool 列表中也列出了。我已经使用了多年,它从未让我失望。

除了使用丑陋的日志文件外,您还可以通过使用 GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword关键字(0x4)打开 DotnetRuntime 私有提供程序( 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 文件并在 “事件” 表下查看时,您可以找到 Fusion 数据:

PerfView中的融合事件

我编写了一个名为Fusion ++的程序集绑定日志查看器,并将其放在 GitHub 上

您可以从此处或通过 Chocolatey 获取最新版本( choco install fusionplusplus )。

希望您和这里的一些访客可以节省一些宝贵的时间。

融合++

只是一小部分信息可能会对他人有所帮助;如果您沿着某个目录中的所有程序集搜索继承 / 实现类 / 接口的类而执行某些操作,那么如果遇到与您自己的程序集有关的错误,请确保清除陈旧的程序集。

该场景将类似于:

  1. 程序集 A 将所有程序集加载到某个文件夹中
  2. 该文件夹中的程序集 B 是陈旧的,但引用了程序集 C
  3. 程序集 C 存在,但是自程序集 B 失效以来,名称空间,类名或其他详细信息可能已更改(在我的情况下,通过重构过程更改了名称空间)

简而言之:A --- 加载 -> B(陈旧)--- 引用 ---> C

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

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

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

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

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

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