如何启用程序集绑定日志记录?

62

我收到了一条信息:“无法加载文件或程序集'Bla'或其某个依赖项。尝试加载具有不正确格式的程序。”

详细信息的部分内容如下:

"WRN: 组件绑定记录已关闭。 要启用组件绑定失败记录,请将注册表值[HKLM\Software\Microsoft\Fusion!EnableLog](DWORD)设置为1。 注意:启用组件绑定失败记录会带来一些性能损失。 要关闭此功能,请删除注册表值[HKLM\Software\Microsoft\Fusion!EnableLog]。"

因此,考虑这可能会让我了解为什么会出现上述错误(也许下一个YSOD会包含更明确的信息,说明它失败的原因),我浏览到了注册表中的该位置,但我看不到这样的键。 它实际上是:

\Fusion 
    (Default)   value not set
    \GACChangeNotification
    \NativeImagesIndex
    \PublisherPolicy

我漏掉了什么?


1
可能是如何在.NET中启用程序集绑定失败日志记录(Fusion)的重复问题。 - Michael Freidgeim
10个回答

74

如果您遇到任何绑定失败的问题,建议您使用"fuslogvw.exe"实用工具进行调查。该工具可以提供与绑定失败相关的信息,以便您无需更改任何注册表值即可打开绑定日志记录。

Fuslogvw MSDN页面

该实用工具应该在您的Microsoft SDKs文件夹中,路径类似于这样,具体取决于您的操作系统:"C:\Program Files (x86)\Microsoft SDKs\Windows\v{SDK版本}A\Bin\FUSLOGVW.exe"

  1. 以管理员身份运行此实用程序,在开发人员命令提示符(作为管理员)中键入 FUSLOGVW,将出现一个新屏幕。

  2. 转到设置,选择启用所有绑定到磁盘,还要选择启用自定义日志路径并选择您选择的文件夹的路径以存储绑定日志。

  3. 重新启动IIS。

  4. 从FUSLOGVW窗口单击删除全部以清除任何先前绑定失败的列表。

  5. 在应用程序中再现绑定失败。

  6. 在实用程序中,单击刷新。然后,您应该看到绑定失败记录在列表中。

  7. 您可以通过选择列表中的条目并单击查看日志来查看有关绑定失败的信息。

我首先查找的是应用程序寻找程序集的路径。您还应确保所涉及程序集的版本号符合您的预期。


38
如果设置是只读的,请尝试以管理员身份运行该工具。 - Chielus
8
回答很好,但是即使我启用了所有绑定的日志记录,它也没有显示任何绑定故障... - demoncodemonkey
10
如果您正在构建一个ASP.NET MVC应用程序(或可能是任何涉及IIS的应用程序),需要重新启动IIS才能获取绑定日志。 - Justin Helgerson
5
如果您在日志查看器中什么都没有看到,那么您可以进入设置并选择“启用所有绑定到磁盘”。然后创建一个文件夹,并赋予它所有权限。在刚刚选择的“日志设置”窗口中,勾选“启用自定义日志路径”以及您刚刚创建的文件夹的路径。重启 IIS 并浏览您的站点,现在您就可以看到日志记录了。 - Krishna
2
顺便提一下,我不得不通过删除临时互联网文件来清除我的Internet Explorer缓存。我甚至不使用Internet Explorer。请参见此页面底部的注释https://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx - user2023861
显示剩余4条评论

30
只需在Fusion键下创建一个新的DWORD(32)。将DWORD命名为EnableLog,并将其值设置为1。然后重新启动IIS,刷新出现错误的页面,错误消息中将显示程序集绑定日志。
确切的注册表路径是[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]。您可以将下面的文本复制到一个新文件EnableLog.reg中,然后双击该文件。
REGEDIT4

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

1
如何创建DWORD(32位)? - Shesha
1
使用注册表编辑器,导航到Fusion键。在右侧窗格的空白处单击鼠标右键。展开“新建”选项,您将看到“DWORD(32位)值”。 - pierce.jason

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

  2. 进入此应用程序池的高级设置

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

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

截图(IIS-ApplicationPool)


3
这不是操作者要求的内容...这个配置只会强制网络应用程序以x32运行,即使在x64系统上。一个以x64编译的DLL在该应用程序中运行可能是根本问题,但此设置的影响远不止解决问题那么简单。 - Dinei

4

对我来说,“Bla”文件是System.Net.http dll,它在我的BIN文件夹中缺失。我只需添加它,它就可以正常工作。没有更改任何注册表键或类似的东西。


2

根据pierce.jason的回答,我尝试了以下方法:

在Fusion键下创建一个新的DWORD(32)。将DWORD命名为LogFailures,并将其值设置为1。然后重新启动IIS,刷新出现错误的页面,错误消息中将显示程序集绑定日志。


2

不必创建新的应用程序池,您可以转到现有的应用程序池->右键单击高级设置->启用32位应用程序-----设置为TRUE


1

当我从客户端调用服务器dll时,在Windows应用程序中会出现此错误。重新启动系统后,它可以正常工作。


1
如果你有时运行不同版本的应用程序,请确保如果当前运行的版本不需要'Bla',则从应用程序bin目录中删除它。

1
在我的情况下,当我清理了解决方案并重新构建它时,问题得到了解决。值得一试!

0
当我遇到同样的问题时,我通过删除该项目中现有的 key.snk 并添加一个新密钥来解决它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接