如何在.NET中启用程序集绑定失败日志记录(Fusion)?
#1楼
如果您已经启用了日志记录,并且在Windows 7 64位上仍然出现此错误,请在IIS 7.5中尝试:
创建一个新的应用程序池
转到此应用程序池的“高级设置”
将Enable 32-Bit Application设置为True
指向您的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楼
只需要一点点信息就可以帮助别人; 如果您在某些目录中搜索继承/实现类/接口的类的所有程序集,那么请确保在遇到与您自己的程序集有关的错误时清除过时的程序集。
场景将是这样的:
- Assembly A加载某个文件夹中的所有程序集
- 此文件夹中的程序集B过时,但引用程序集C
- 程序集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-C01A46FAF4CA
和FusionKeyword
关键字(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数据:
#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列表中。 我个人已经使用了多年,它永远不会让我失望。