无法加载文件或程序集“Microsoft.Practices.Unity”

时间:2014-01-20 19:28:21

标签: c# assembly-loading

我正在尝试将Unity升级到版本(2.1.505.2),但是当我运行应用程序时,我得到以下FileLoadException

  

无法加载文件或程序集'Microsoft.Practices.Unity,   Version = 2.0.414.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'   或其中一个依赖。

我们正在从Unity 2.0.414.0升级到2.1.505.2。

  • 解决方案中涉及Unity的所有项目引用都引用了正确版本的dll
  • Gac中没有引用Unity dll。 (通过检查gacutil -l)双重检查
  • 我从存档中删除了所有Unity dll。用powershell双重检查

    PS C:\> ls -rec -inc Microsoft.Practices.Unity.dll | foreach-object { "{0}`t{1}" -f $_.FullName, [System.Diagnostics.FileVersionInfo]::GetVersionInfo($_).FileVersion }
    

如何找出仍然引用Unity 2.0.414.0的内容?

FusionLogVw没有告诉我哪个DLL导致了这个问题。

非常感谢任何帮助!

7 个答案:

答案 0 :(得分:12)

问题是另一个微软dll引用旧版本的统一。我发现这是偶然的,检查每个引用的dll的命名空间,并找到另一个包含“unity”命名空间的dll。

更新

  • Microsoft.Practices.EnterpriseLibrary.Common
  • Microsoft.Practices.EnterpriseLibrary.Validation

最新发布的版本解决了这个问题。

我希望我能为那些在这个问题上拉扯他们的头发而失去灵魂的那一天拯救...... :)

答案 1 :(得分:1)

您应该将重定向添加到正确的程序集中:

请注意,版本2.1.505.0 应该用于重定向!

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <assemblyIdentity name="Microsoft.Practices.Unity" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.1.505.0" newVersion="2.1.505.0" />
  </dependentAssembly>
</assemblyBinding>

由于下一个原因,您无法设置 2.1.505.2

enter image description here

Unity程序集 2.1.505.2 包含AssemblyFileVersion和AssemblyVersion的不同版本。

CLR不关心AssemblyFileVersion,所以只使用AssemblyVersion! 而AssemblyFileVersion仅由nuget使用!

答案 2 :(得分:0)

检查你的app.config / web.config,当然还有你的项目参考。

答案 3 :(得分:0)

由于您的新问题是关于在程序集上查找现有依赖项,因此您可以参考以下问题:

How to find what depends on a specific version of a specific dependency?

指的是使用Fuslogvw.exe

答案 4 :(得分:0)

如果你有resharper,你可以删除问题引用,构建,转到使用它的类(有错误)并获得resharper为你修复它。

节省手段,但我感谢不是每个人都有resharper:D

答案 5 :(得分:0)

<强>概述: 这是某人的代码我必须修复代码中的错误,所以他们为我提供了一个应用程序的zip文件。

我不知道发生了什么以及为什么我的代码第一次运行并且在重新启动应用程序(发布任何更改)后,它开始抛出异常。 在论坛中提供了许多可能的解决方案,我责备我的代码&amp;数据库,然后开始撤消我做的每一步。但这没有帮助

<强>解决方案: 由于多次故障排除无法解决此问题 但是,当我重新开始调查每一件事情,并发现导致异常的实际原因时,我发现是

对于每个新版本,我的应用程序的bin文件夹删除dll

  

然后解决方案是将这些dll粘贴到应用程序bin文件夹中并重建代码   (参见截图)

结果:一切都没有了。

enter image description here

答案 6 :(得分:0)

我无法通过接受的解决方案中的EnterpriseLibrary更新来更正它。我最终只是覆盖了 app.config 中的从属程序集版本,您可以执行类似的操作来强制所有抱怨该版本的库使用其他版本。

App.config:

  <dependentAssembly>
    <assemblyIdentity name="Unity.Container" publicKeyToken="489B6ACCFAF20EF0" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-5.8.11.0" newVersion="5.8.11.0"/>
  </dependentAssembly>