【问题标题】:Visual Studio 2010 UnresolvedAssemblyException: Type universe cannot resolve assembly: log4netVisual Studio 2010 UnresolvedAssemblyException:类型 Universe 无法解析程序集:log4net
【发布时间】:2011-05-02 21:55:39
【问题描述】:

最近,我开始在 Visual Studio 2010 WPF 设计器中遇到异常,似乎是由于 log4net。如果我新构建我的项目,XAML 文件将正确显示在设计器中。然后,一旦我开始单击控件以在 XAML 中跳转,这个异常很快就会被抛出:

System.Reflection.Adds.UnresolvedAssemblyException

Type universe cannot resolve assembly: log4net, Version=1.2.10.0, Culture=neutral,    PublicKeyToken=1b44e1d426115821.

at System.Reflection.Adds.AssemblyProxy.GetResolvedAssembly()
at System.Reflection.Adds.AssemblyProxy.GetHashCode()
continues...

只有当我删除 log4net 引用时,问题才会消失。这是现在第二个表现出这种行为的项目。有其他人看到这个和/或找到解决方法吗?

注意:我使用的是 .NET 4 Full(不是客户端配置文件),并且我在 log4net 参考 T/F 上切换了特定版本,但无济于事。

【问题讨论】:

  • 您能否提供您添加到 web.config 中的代码来切换特定版本?
  • 没有 web.config,在 VS IDE 属性窗口中切换了特定版本

标签: wpf exception xaml log4net


【解决方案1】:

之后我设法解决了这个问题:

  1. 找到this blog,作者通过将未解决的程序集放在Public Assemblies文件夹中解决了类似的情况(使用k3b的fuslogvw工具找到)

  2. 遇到FileLoadException,这让我找到了this SO post

  3. 下载新的 log4net 副本,解锁 zip 文件,并替换 VS 和 Public Assemblies 文件夹中的引用。

但是,我仍然不确定为什么必须将此特定程序集放在 Public Assemblies 文件夹中。我引用的所有其他程序集都不需要此步骤。

【讨论】:

  • 这个错误快把我逼疯了...我正在尝试使用第一个解决方案,但我感觉有点失落...有人可以说明一下吗??
  • 什么是“第一个解决方案” - 使用 k3b 提到的 Fuslogvw.exe?
【解决方案2】:

您可以使用 dotnet sdk 的“Assembly Binding Log Viewer”(Fuslogvw.exe) 来了解何时以及为什么加载了哪个 dll。如果启用了日志记录,它可以向您显示加载了哪些程序集以及导致它加载的程序集。

详情见http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.80).aspx

有时 dll 存在但版本错误。

如果您将 Universe.dll 包含到您的项目中,您还必须包含 log4net.dll 且 local copy=true

【讨论】:

  • 我似乎无法从 Fuslogvw.exe 获得答案。在 VS 2010 中重建后,会出现绑定日志,但每个日志都会显示:The operation failed. Bind result: hr = 0x80070002. The system cannot find the file specified. 此消息出现在每个参考 DLL 的每个日志中,无论我是否包含/排除 log4net,而没有其他看起来可以透露的信息。
  • 日志应包含以下信息:Wich dll-requested log4net.dll 以及搜索发生的位置。 log4net.dll 在搜索的目录之一中吗?您是否在 gui 项目中包含了带有 local copy=true 的 log4net.dll?
  • 我将设置更改为记录到自定义路径和“记录绑定失败到磁盘”。以前,我正在记录所有绑定。现在,当我在 VS 中工作并且发生 UnresolvedAssemblyException 时,fuslogvw 中没有出现错误!我可以多次重建/体验异常,而 fuslogvw 没有检测到任何绑定错误...
  • log4net.dll 不在搜索到的目录之一中,我已将“复制本地”切换为无效。
  • 我将如何尝试找到它:退出 Vs2010;启动 Fuslogvw.exe(在 win7 上以管理员身份)。选择“将失败记录到磁盘”。重新启动Vs2010。发生错误后,在 Fuslogvw 中按“刷新”。现在你应该看到错误了。
【解决方案3】:

在项目属性/引用路径中添加程序集“log4net”的路径。

http://msdn.microsoft.com/en-us/library/6taasyc6(v=VS.100).aspx

【讨论】:

  • 假设这可行,您仍然必须为每个出现此问题的项目执行此操作。
  • 您可以创建一个 .Targets 文件,其中包含您对 log4net 程序集的引用。在每个项目中,您可以导入 .Targets 文件,这样您就可以从一个点控制公共引用。
【解决方案4】:

原来我们遇到这个问题是因为我们用来添加引用的路径。

我们正在使用一些自定义的“.targets”文件来定义引用。项目中有很多混合依赖项,使用 .targets 文件有助于将引用定义在一个地方。

嗯,引用 HintPath 的结果类似于...

<HintPath>C:\Program Files (x86)\\Custom\CustomControlsWPF2.2011\Source\\..\Binaries\WPF\Custom.Windows.Controls.dll</HintPath>

当我们删除双黑斜线,替换为单“\”时,“Visual Studio 2010 UnresolvedAssemblyException:Type Universe 无法解析程序集”错误消失了。

本应如此。

<HintPath>C:\Program Files (x86)\Custom\CustomControlsWPF2.2011\Source\..\Binaries\WPF\Custom.Windows.Controls.dll</HintPath>

【讨论】:

    【解决方案5】:

    确保您的代码在设计时和运行时都运行。如果您的代码在设计时运行,请不要假定 Application.Current 是您的应用程序。例如,当您使用 Expression Blend 时,Current 是 Expression Blend。导致自定义控件在设计时失败的典型操作包括以下内容。

    -Casting Current to your custom subclass of Application.
    
    -Using the FindName method on Current.
    
    -Not checking whether Application.Current has returned a value that is null. If Visual Studio does not create an application object, then Application.Current may return null.
    

    http://msdn.microsoft.com/en-us/library/ff356886%28v=vs.95%29.aspx

    试试这个。在函数的开头添加它:

    // Check for design mode. 
    if ((bool)(System.ComponentModel.DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue))
    {
        return;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2014-07-16
      • 2014-01-27
      • 1970-01-01
      相关资源
      最近更新 更多