880

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

4

13 回答 13

937

将以下值添加到

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
添加:
DWORD ForceLog 设置值为 1
DWORD LogFailures 将值设置为 1
DWORD LogResourceBinds 设置值为 1
DWORD EnableLog 设置值为 1
String LogPath 设置日志文件夹的值(例如 C:\FusionLog\)

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

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

顺便说一句,不要忘记在不需要时关闭融合日志记录。

在此处输入图像描述

于 2009-10-06T18:23:54.280 回答
294

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

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

完成后记得关闭注销!

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

于 2010-07-15T14:49:48.717 回答
196

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

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

于 2010-05-19T08:26:46.220 回答
98

您可以以管理员身份运行此 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
于 2015-10-08T10:26:24.200 回答
89

设置以下注册表值:

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

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

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

Windows Registry Editor Version 5.00

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

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

于 2008-11-01T09:00:13.630 回答
29

程序集绑定日志查看器 (FUSLOGVW.exe)有很多问题,我决定编写一个名为Fusion++ 的替代查看器并将其放在 GitHub 上它在内部使用相同的机制,但会为您解析日志。您根本不需要关心任何设置,甚至不需要记录路径

您可以从这里或通过巧克力 ( choco install fusionplusplus)获取最新版本。

我希望你和这里的一些访客可以用它来节省一些有价值的终生时间。

融合++

于 2019-05-09T21:39:14.180 回答
20

Fusion Log Settings Viewer changer script是最好的方法。

ASP.NET中,有时很难让它正常工作。这个脚本效果很好,也被列在Scott Hanselman 的电动工具列表中。我个人使用它已有多年,它从未让我失望。

于 2011-10-21T05:37:21.420 回答
14

除了使用丑陋的日志文件,您还可以通过ETW/xperf激活 Fusion 日志,方法是打开Microsoft-Windows-DotNETRuntimePrivate带有 GUID763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword关键字 (0x4) 的 DotnetRuntime Private 提供程序 ( )。

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

PerfView 中的融合事件

于 2015-03-31T17:22:02.867 回答
6

对于那些有点懒惰的人,我建议您将其作为 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
于 2019-05-08T15:46:15.033 回答
4

只是一点点可能对其他人有所帮助的信息;如果您按照在某个目录中搜索所有程序集以查找继承/实现类/接口的类的方式执行某些操作,那么如果您收到与您自己的程序集之一有关的此错误,请确保清除过时的程序集。

场景将类似于:

  1. 程序集 A 在某个文件夹中加载所有程序集
  2. 此文件夹中的程序集 B 已过时,但引用程序集 C
  3. 程序集 C 存在,但命名空间、类名或其他一些细节可能在程序集 B 过时后发生了变化(在我的例子中,命名空间是通过重构过程更改的)

简而言之:A ---loads--> B (stale) ---references---> C

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

于 2013-07-18T15:03:37.500 回答
3

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

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

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

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

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

于 2012-04-17T23:50:38.963 回答
3

以防万一您想知道 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 Tools\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

于 2018-10-27T15:31:11.797 回答
-1

在我的情况下,帮助输入小写的磁盘名称

错误- C:\someFolder

正确- c:\someFolder

于 2019-01-21T09:45:16.793 回答