定位的程序集的清单定义与程序集引用不匹配

leo*_*ora 715 c# dependencies compiler-errors reference version

我试图在C#Windows窗体应用程序(Visual Studio 2005)中运行一些单元测试,我收到以下错误:

System.IO.FileLoadException:无法加载文件或程序集"Utility,Version = 1.2.0.200,Culture = neutral,PublicKeyToken = 764d581291d764f7"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)**

在x.Foo.FooGO()

在Foo.cs中的x.Foo.Foo2(String groupName_):第123行

在FooTests.cs中的x.Foo.UnitTests.FooTests.TestFoo():第98行**

System.IO.FileLoadException:无法加载文件或程序集'Utility,Version = 1.2.0.203,Culture = neutral,PublicKeyToken = 764d581291d764f7'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)

我查看我的参考资料,我只参考Utility version 1.2.0.203(另一个是旧的).

关于我如何弄清楚试图引用这个旧版本的DLL文件的任何建议?

此外,我认为我的硬盘上甚至没有这个旧组件.有没有工具可以搜索这个旧的版本化程序集?

Lar*_*ens 449

.NET程序集加载程序无法找到1.2.0.203,但确实找到了1.2.0.200.此程序集与请求的内容不匹配,因此您收到此错误.简单来说,它找不到引用的程序集.通过将其放入GAC或应用程序路径,确保它可以找到正确的程序集.另请参阅http://blogs.msdn.com/junfeng/archive/2004/03/25/95826.aspx.

  • 确切地说 - 它正在寻找*1.2.0.203,但它*发现*1.2.0.200.找出该文件的位置,并用正确的版本替换它. (124认同)
  • 我在这里问了一个类似的问题,得到了一个有效的解决方案:http://stackoverflow.com/questions/4187907/net-picking-wrong-referenced-assembly-version (17认同)
  • 但是当我看到项目的参考时,它指向1.2.0.203 .. 似乎没有任何东西指向1.2.0.200了 (16认同)
  • 检查引用版本,然后在packages.config和Web.config中查看它是否相同 (13认同)
  • 每次,这条消息使我感到困惑。它似乎是向后写的。我希望它抱怨您要求加载的版本,而不是它找到的版本。很高兴我不是唯一理解错误的人! (2认同)

Set*_*son 90

您可以执行以下操作来解决此问题.首先,使用Windows文件搜索在硬盘驱动器中搜索程序集(.dll).获得结果列表后,执行查看 - >选择详细信息...,然后选中"文件版本".这将在结果列表中显示版本号,以便您可以查看旧版本的来源.

此外,像Lars所说,检查您的GAC以查看其中列出的版本.此Microsoft文章声明在GAC中找到的程序集在构建期间不会在本地复制,因此您可能需要在执行重建之前删除旧版本.(有关创建批处理文件的说明,请参阅我对此问题的回答)

如果仍然无法确定旧版本的来源,可以使用Visual Studio附带的fuslogvw.exe应用程序来获取有关绑定失败的更多信息.Microsoft 在此处提供有关此工具的信息.请注意,您必须通过将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog注册表项设置为1 来启用日志记录.

  • 不要忘记文件版本不是程序集标识的一部分.程序集版本是,但不必与文件版本相同! (18认同)
  • 这么多年过去了,塞斯,你仍然在帮助我。 (3认同)

Nat*_*ord 58

我自己也遇到了这个问题,我发现这个问题与其他问题不同.

我有两个我的主项目引用的DLL:CompanyClasses.dll和CompanyControls.dll.我收到运行时错误说:

无法加载文件或程序集'CompanyClasses,Version = 1.4.1.0,Culture = neutral,PublicKeyToken = 045746ba8544160c'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配

麻烦的是,我的系统上没有任何CompanyClasses.dll文件,版本号为1.4.1.GAC中没有,app文件夹中没有...没有任何地方.我查了整个硬盘.我拥有的所有CompanyClasses.dll文件都是1.4.2.

我发现,真正的问题是CompanyControls.dll引用了CompanyClasses.dll的1.4.1版本.我刚刚重新编译了CompanyControls.dll(在它引用了CompanyClasses.dll 1.4.2之后),这个错误就此消失了.

  • +1 当我的一个 DLL 引用旧版本的 Caliburn Micro 时,类似的事情发生在我身上。 (2认同)
  • 另一种选择是打开“CompanyControls”项目,右键单击“CompanyClasses.dll”引用 --> 属性 -->“SpecificVersion = false” (2认同)

Yan*_*v.H 51

以下内容将任何程序集版本重定向到3.1.0.0版.我们有一个脚本,它将始终在App.config中更新此引用,因此我们永远不必再次处理此问题.

通过反射,您可以获取程序集publicKeyToken并从.dll文件本身生成此块.

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly>
    <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="3.1.0.0" />
  </dependentAssembly>
</assemblyBinding>
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有XML命名空间属性(xmlns),这将不起作用.


小智 43

如果您使用的是Visual Studio,请尝试"清理解决方案",然后重建项目.

  • 这通常是我的解决方案.通常,删除`bin`和`obj`就可以了.基本上,我曾经参考的东西仍然坐在那里试图满足相同的要求.例如,旧版本是我直接引用的,新版本是在NuGet上. (12认同)
  • 为我工作.删除了bin amd obj文件夹并解决了问题. (3认同)
  • “干净的解决方案”对我没有任何作用。(微软???)但删除 bin 和 obj 文件夹修复了它。谢谢! (2认同)

Ray*_*ess 33

其他答案对我不起作用.如果你不关心版本而你只想要你的应用程序运行,那么右键单击引用并将"特定版本"设置为false ...这对我有用. 在此输入图像描述

  • 该设置仅在*编译时*生效.在编译之后,它将需要与您编译它的完全相同的程序集版本.请参见http://stackoverflow.com/questions/24022134/how-exactly-does-the-specific-version-property-of-an-assembly-reference-work-i (8认同)

小智 21

我刚遇到这个问题,问题是我的应用程序调试目录中有.dll的旧副本.您可能还想检查那里(而不是GAC),看看你是否看到它.


fra*_*aro 20

我添加了一个NuGet包,只是为了实现我的应用程序的黑盒部分引用了旧版本的库.

我删除了包并引用了旧版本的静态DLL文件,但是web.config文件从未更新过:

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

当我卸载软件包时应该恢复到的内容:

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)


Lev*_*ler 16

在我的例子中,运行ASP.NET应用程序时发生此错误.解决方案是:

  1. 删除项目文件夹中的objbin文件夹

干净不起作用,重建不起作用,所有引用都很好,但它没有编写其中一个库.删除这些目录后,一切都很完美.

  • 谢谢,李维·富勒。这个答案应该更高。对于我的情况,这是现场!对我来说,当我制作web.config的备份副本时,即使我删除了重复的副本,Visual Studio仍在加载此配置文件而不是实际的配置,此错误开始。这解决了。谢谢。 (2认同)

cod*_*key 16

我现在要打动大家。。。

<assemblyBinding>从您的.config文件中删除所有引用,然后从NuGet软件包管理器控制台中运行以下命令:

Get-Project -All | Add-BindingRedirect
Run Code Online (Sandbox Code Playgroud)

  • 这涉及解决方案中的所有项目。因此,如果仅涉及单个项目,请首先调用“Get-Project MyProject”以验证它是否准确找到了您想要的内容。然后调用`Get-Project MyProject | 添加绑定重定向`。 (7认同)
  • 你节省了我的时间 (5认同)
  • 这仅在软件包管理格式为packages.config时有效,如果您使用的是不带packages.config的2017 csproj,它将起作用:( (3认同)
  • 正式震撼人心 (2认同)
  • 随着时间的推移,我已经更新了这个产品......有时只需刷新工件并重新进行即可。我认为我可以做的唯一不同的事情是创建一个新项目并手动将元素放入其中...这个命令使我不必这样做...有一天我将不得不支付技术债务?也许吧,但今天不是邪恶的。 (2认同)

Mar*_*arz 15

您是否可能在 assemblyBinding 中使用了错误的块版本,请尝试:

  1. 删除 web.config / app.config 中所有程序集绑定内容:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Extensions.DependencyInjection" publicKeyToken="adb9793829ddae60" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.1.3.0" newVersion="3.1.3.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
  </dependentAssembly>
</assemblyBinding>
Run Code Online (Sandbox Code Playgroud)
  1. 在包管理器控制台中键入:Add-BindingRedirect
  2. 生成所有必要的绑定重定向
  3. 运行您的应用程序并查看它是否正常工作。如果没有,请添加包控制台错过的任何缺失的绑定重定向。

  • 多谢!!!拯救了我的一天(虽然少了 2 个小时)! (3认同)

Gla*_*lor 14

在我的例子中,它是C:\ WINDOWS\Microsoft.NET\Framework \〜\ Temporary ASP.NET Files \目录中的旧版DLL.您可以删除或替换旧版本,也可以删除并添加对项目中DLL的引用.基本上,无论哪种方式都会创建一个指向临时ASP.NET文件的新指针.

  • 当我关闭Visual Studio,停止IIS并删除所有临时ASP.NET文件时,这对我有用.请注意,如果在64位计算机上以及.NET 2.0和4.0文件夹中,Framework和Framework64文件夹中可能存在文件! (2认同)

Sir*_*ire 8

对我们来说,问题是由其他原因造成的.DevExpress组件的许可证文件包括两行,一行用于此特定计算机上未安装的旧版本组件.从许可证文件中删除旧版本解决了该问题.

令人讨厌的部分是错误消息没有给出引起问题的引用的指示.

  • 在我的例子中,在升级到新的DevExpress版本之后,表单的.resx文件包含对旧的未安装的库版本的引用.我必须在代码视图中打开.resx并将版本更正为新版本或删除无效条目. (2认同)

Guy*_*uck 5

如果您尝试使用反射进行后期绑定,如果您要绑定的程序集获得强名称或更改了其公钥标记,则会引发完全相同的错误.即使实际上没有找到使用指定公钥令牌的任何程序集,错误也是相同的.

您需要添加正确的公钥令牌(您可以使用dll上的sn -T获取它)来解决错误.希望这可以帮助.

  • "sn.exe"是Visual Studio附带的工具,它是一个可以从Visual Studio命令提示符运行的命令行工具.只需运行Visual Studio命令提示符(从开始菜单),导航到包含程序集的文件夹,然后键入"sn -T <assembly>",其中<assembly>是dll的全名.这将获得程序集"令牌"信息.完成此操作后,当您使用反射进行后期绑定时,请将令牌信息输入到程序集ID字符串中(即"Assembly = MyAssembly.dll,Public Key Token = <token guid>") (3认同)
  • 谢谢你的回答.我在App.ini中引用配置部分时遇到此错误.我最近签署了程序集,因此必须使用新的(正确的)令牌更新PublicKeyToken = null. (2认同)

Bij*_*mon 5

我的情况与内森贝德福德的情况非常相似,但略有不同.我的项目也以两种方式引用了更改后的dll.1)直接和2)间接引用一个组件(类库),该组件本身具有对已更改的dll的引用.现在我的组件(2)的Visual Studio项目引用了更改后的dll的正确版本.但是,组件本身的版本号未更改.因此,安装新版本的项目无法替换客户端计算机上的该组件.

最终结果:直接引用(1)和间接引用(2)指向客户端计算机上已更改的dll的不同版本.在我的开发机器上它工作正常.

解决方案:删除申请; 从应用程序文件夹中删除所有DLLS; 重新安装.就像我的情况一样.


小智 5

我的问题是将源代码复制到新机器而不拉取任何引用的程序集。

我没有采取任何措施来修复该错误,因此我匆忙地完全删除了 BIN 目录。重建了我的源代码,从那时起它就开始工作了。


Tho*_*mas 5

我的 app.config 包含一个

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.11.0"/>
Run Code Online (Sandbox Code Playgroud)

对于 npgsql。不知何故在用户的机器上,我的 app.exe.config 丢失了。我不确定这是否是一个愚蠢的用户、安装程序故障或反病毒软件。替换文件解决了这个问题。


Ben*_*ius 5

我想补充一点,我正在创建一个基本的 ASP.NET MVC 4 项目,并通过 NuGet 添加了 DotNetOpenAuth.AspNet。在我为 Microsoft.Web.WebPages.OAuth 引用了不匹配的 DLL 文件后,这导致了同样的错误。

为了修复它,我做了一个Update-Package并清理了完整重建的解决方案。

这对我有用并且是一种懒惰的方式,但是时间就是金钱:-P

  • 对我来说类似的答案。`Update-Package -reinstall` 重新安装所有相同版本的 NuGet 包。 (2认同)
  • 这很棒; 感谢发布。我尝试了所有这些其他很棒的建议,但这是成功的解决方案。谢天谢地,那些仍然愿意发布替代解决方案的人,即使有 80 个可用的解决方案 (2认同)

ced*_*lof 5

在 Team Foundation Server 的构建服务上构建时出现此错误。事实证明,我的解决方案中有多个项目,使用 NuGet 添加的同一库的不同版本。我使用 NuGet 删除了所有旧版本,并添加了新版本作为参考。

Team Foundation Server 将所有 DLL 文件放在一个目录中,当然一次只能有一个特定名称的 DLL 文件。

  • 另一种方法是单击“管理解决方案的 NuGet 包...”并将测试项目和正在测试的项目更新到相同(最新)版本。 (2认同)

Col*_*ole 5

在尝试了上述许多解决方案但没有解决之后,最终需要确保在 Visual Studio 的应用程序中打开“自动生成绑定重定向”。

在此输入图像描述

有关启用自动绑定重定向的更多信息,请访问:https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection