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

本文详细介绍了如何在.NET环境中启用程序集绑定失败日志记录(Fusion),包括通过修改注册表设置、使用FusionLogViewer和ETW/xperf进行日志记录,以及在IIS中配置应用程序池。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


#1楼

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

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

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

  3. Enable 32-Bit Application设置True

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


#2楼

添加以下值

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

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

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

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


#3楼

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

场景将是这样的:

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

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

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


#4楼

设置以下注册表值:

[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资源管理器运行该文件,并忽略有关可能的损坏的警告。


#5楼

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

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


#6楼

您还可以通过使用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中的融合事件


#7楼

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

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

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

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


#8楼

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

#9楼

万一你想知道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


#10楼

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

错了 - C:\\ someFolder

正确 - c:\\ someFolder


#11楼

对于那些有点懒惰的人,我建议将其作为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

#12楼

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

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

我希望你和这里的一些游客可以节省一些值得一生的时间。

融合++


#13楼

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

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

************** 异常文本 ************** System.IO.FileNotFoundException: 未能加载文件或程序集“System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。系统找不到指定的文件。 文件名:“System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089” ---> System.IO.FileNotFoundException: 未能加载文件或程序集“System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。系统找不到指定的文件。 文件名:“System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089” === 预绑定状态信息 === 日: DisplayName = System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 (Fully-specified): Appbase = file:///D:/Ruijie/office2/ 日: 初始 PrivatePath = NULL 调用程序集: System.Data.SQLite, Version=1.0.94.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139。 === 日:绑定从 default 加载上下文开始。 日: 未找到应用程序配置文件。 日: 使用主机配置文件:: 使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 的计算机配置文件。 日: 在框架配置中找到版本重定向: 2.0.0.0 已重定向到 4.0.0.0。 日: 策略后引用: System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 日: 尝试下载新的 URL file:///D:/Ruijie/office2/System.Data.DLL。 日: 尝试下载新的 URL file:///D:/Ruijie/office2/System.Data/System.Data.DLL。 日: 尝试下载新的 URL file:///D:/Ruijie/office2/System.Data.EXE。 日: 尝试下载新的 URL file:///D:/Ruijie/office2/System.Data/System.Data.EXE。 在 xhktoffice2010.Form_Main.LoadSkinData(Int32 softId) 在 xhktoffice2010.Form_Main..ctor(Int32 m_xiufucishu, Int32 softid, String newdate, Int32 ggCount, String link1, String link2, String url1, String url2) 在 xhktoffice2010.loadForm.start() 在 xhktoffice2010.loadForm.wtwiT3wj6ra(Object , EventArgs ) 在 System.Windows.Forms.Timer.OnTick(EventArgs e) 在 System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ************** 已加载的程序集 ************** mscorlib 程序集版本:4.0.0.0 Win32 版本:4.8.9290.0 built by: NET481REL1LAST_C 基本代码:fil
最新发布
03-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值