我如何在.NET中启用程序集绑定失败日志记录(融合)?
当前回答
您也可以通过ETW/xperf通过GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CA和FusionKeyword关键字(0x4)打开dotnetruntimeprivate提供者(Microsoft-Windows-DotNETRuntimePrivate)来激活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数据:
其他回答
融合日志设置查看器更改脚本是做到这一点的最好方法。
在ASP。NET中,有时要使它正确工作是很棘手的。这个脚本工作得很好,也被列入了Scott Hanselman的Power Tool列表。我个人已经使用它很多年了,它从来没有让我失望过。
在我的例子中,帮助键入小写的磁盘名称
错误- C:\someFolder
正确- c:\someFolder
这不是回答,而是警告:
如果你曾经启用这个日志记录,不要忘记禁用它,否则你以后会后悔的。
我确实忘记了,我最终得到了几个GB的小日志文件,HTM扩展在C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\IE文件夹中-它显然记录了NT AUTHORITY\SYSTEM帐户下运行的应用程序的所有程序集绑定。
文件数量超过300万,Total Commander和Windows资源管理器都不能显示内容或文件夹大小而不挂起。
在禁用日志记录并重新启动之后,我从命令提示符中运行了删除。
删除三星970 Pro SSD上的所有文件花了超过15分钟,它一直显示100%的磁盘使用率-我的高端PC工作站被这个删除操作弄得瘫痪,直到它完成才有部分响应。
对于那些有点懒的人,我建议当你想要启用它时,把它作为一个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
只是一点点可能会帮助别人的信息;如果您在某个目录中搜索继承/实现类/接口的类的所有程序集,那么如果您得到与您自己的某个程序集相关的此错误,请确保您清除了过时的程序集。
场景是这样的:
程序集A装入某个文件夹中的所有程序集 此文件夹中的程序集B已过期,但引用程序集C 程序集C存在,但是名称空间、类名或其他一些细节可能在程序集B失效后发生了变化(在我的例子中,名称空间是通过重构过程改变的)。
简而言之:——加载> B(过期)——引用——> C
如果发生这种情况,唯一的迹象是错误消息中的名称空间和类名。仔细检查。如果您在解决方案中到处都找不到它,那么您可能正在尝试加载一个陈旧的程序集。
推荐文章
- 在c#中从URI字符串获取文件名
- 检查SqlDataReader对象中的列名
- 如何将类标记为已弃用?
- c# 8支持。net框架吗?
- Linq-to-Entities Join vs GroupJoin
- 为什么字符串类型的默认值是null而不是空字符串?
- 在list中获取不同值的列表
- 组合框:向项目添加文本和值(无绑定源)
- AutoMapper:“忽略剩下的?”
- 如何为ASP.net/C#应用程序配置文件值中的值添加&号
- 从System.Drawing.Bitmap中加载WPF BitmapImage
- 如何找出一个文件存在于c# / .NET?
- 为什么更快地检查字典是否包含键,而不是捕捉异常,以防它不?
- [DataContract]的命名空间
- string. isnullorempty (string) vs. string. isnullowhitespace (string)