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


751

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

System.IO.FileLoadException:无法加载文件或程序集“实用程序,版本= 1.2.0.200,区域性=中性,PublicKeyToken = 764d581291d764f7”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT的异常:0x80131040)**

在x.Foo.FooGO()

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

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

System.IO.FileLoadException:无法加载文件或程序集“实用程序,版本= 1.2.0.203,区域性=中性,PublicKeyToken = 764d581291d764f7”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自HRESULT的异常:0x80131040)

我查看自己的参考文献,但只有一个参考文献Utility version 1.2.0.203(另一个是旧的)。

关于我如何找出试图引用此DLL文件旧版本的任何建议?

此外,我认为我的硬盘上甚至没有这个旧程序集。有什么工具可以搜索这个旧版本的程序集吗?


就我而言,这是因为我有两个项目以不同的版本加载相同的DLL。(希望这对某人有帮助!)
miguelmpn

Answers:


461

.NET程序集加载器:

  • 找不到1.2.0.203
  • 但确实找到了1.2.0.200

该程序集与请求的程序集不匹配,因此出现此错误。

简而言之,它找不到所引用的程序集。通过将其放在GAC或应用程序路径中,确保可以找到正确的程序集。另请参阅https://docs.microsoft.com/archive/blogs/junfeng/the-located-assemblys-manifest-definition-with-name-xxx-dll-does-not-match-the-assembly-reference


19
但是当我查看该项目的引用时,它指向1.2.0.203 ..。似乎什么都没有指向1.2.0.200
leora

128
确实-它正在寻找 1.2.0.203,但是找到了 1.2.0.200。找出该文件在哪里,并用正确的版本替换它。
乔恩·斯基特

18
我在这里问过类似的问题,并得到了工作液:stackoverflow.com/questions/4187907/...
迈克尔·拉Vo1E时

13
检查参考版本,然后在packages.config和Web.config中查看其版本是否相同
zdarsky.peter 2014年

4
每次,这条消息使我感到困惑。它似乎是向后写的。我希望它抱怨您要求加载的版本,而不是它找到的版本。很高兴我不是唯一理解错误的人!
格雷格·伍兹

91

您可以做几件事来解决此问题。首先,使用Windows文件搜索在硬盘驱动器中搜索程序集(.dll)。获得结果列表后,请执行View-> Choose Details ...,然后检查“ File Version”。这将在结果列表中显示版本号,因此您可以看到旧版本可能来自何处。

另外,就像Lars所说的那样,检查您的GAC以查看那里列出了什么版本。Microsoft的这篇文章指出,在构建过程中不会在本地复制在GAC中找到的程序集,因此您可能需要先删除旧版本,然后再进行全部重建。(有关创建批处理文件的注释,请参阅我对这个问题的回答)

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


19
不要忘记文件版本不是程序集标识的一部分。程序集版本是但不必与文件版本相同!
Lars Truijens 2011年

如果使用fuslogvw提供服务,请阅读blogs.msdn.com/b/junfeng/archive/2004/02/14/72912.aspx
Nick

搜索文件名解决了我的问题。我的Temporary ASP.Net文件夹中有一个旧版本的dll,InstallShield正在使用该版本而不是最新版本!干净的解决方案,重建,重新启动PC没做任何事情。在本地运行良好,每次部署时都会崩溃。
JumpingJezza

建好后,我的网站立即运行正常,但是不久之后,这个问题出现了。
Shavais

我编辑了这个答案,改为说汇编版本。
Worthy7

60

我只是自己遇到了这个问题,而我发现这个问题与其他人遇到的问题有所不同。

我的主项目引用了两个DLL:CompanyClasses.dll和CompanyControls.dll。我收到运行时错误消息:

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

麻烦的是,我的系统上没有任何版本为1.4.1的CompanyClasses.dll文件。GAC中没有,应用程序文件夹中没有...在任何地方都没有。我搜索了整个硬盘。我拥有的所有CompanyClasses.dll文件均为1.4.2。

我发现真正的问题是CompanyControls.dll引用了CompanyClasses.dll的1.4.1版本。我只是重新编译了CompanyControls.dll(在引用了CompanyClasses.dll 1.4.2之后),这个错误对我来说还是消失了。


2
+1当我的一个DLL引用了Caliburn Micro的旧版本时,发生了类似的事情。
杰森·梅西

我也是,您的经历激发了我需要寻找的地方,并且解决了我的问题。
Esen 2013年

另一个选择是打开CompanyControls项目,右键单击CompanyClasses.dll引用->属性->SpecificVersion = false
BlueRaja-Danny Pflughoeft

在xamarin应用程序上经常出现这种情况。我的xamarin.forms项目不同于xamarin.droid项目。我刚刚看到了您的帖子,并且认出了它。
batmaci

如果CompanyClasses.dll已签名,那么SpecificVersion = false仅凭它就不会削减它。您需要一个bindingredirect
丹妮丝·斯基德莫尔'18

53

以下内容将所有程序集版本重定向到版本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>

请注意,如果没有XML名称空间属性(xmlns),此功能将无效。


1
这对我有用。我改变了'NEWVERSION = 3.3.3'到'NEWVERSION = 3.1.0'
jward01

如果可以避免的话,最好不要走重新绑定的路线。当那个臭虫咬你的时候,它会很难咬。
BanksySan

1
我的问题是重定向指向不存在的程序集.App.Config保存了我安装的最新NuGet程序包中的程序集信息。当我稍后将这些软件包降级时,它并没有清理干净。这是一个4.7.2框架单元测试项目使用的.NET标准类库。在运行时呈现的单元测试项目的问题..
d-教

@ D-Sect是正确的。如果您的源代码管理指示web.config进行了更改(因为您一直在使用NuGets进行播放),那么明智的做法是将那些bindingRedirects撤回其中。降级NuGets不会清理绑定重定向
bkwdesign

45

如果您使用的是Visual Studio,请尝试“清除解决方案”,然后重新生成您的项目。


14
这通常是我的解决方案。通常,删除binobj执行。基本上,我曾经引用的东西仍然坐在那里,试图满足相同的要求。例如,旧版本是我直接引用的东西,而新版本是在NuGet上。
大卫·贝兹

从TFS中提取后,几个DLL遇到此问题。这个解决方案为我解决了。
米洛

3
为我工作。删除bin amd obj文件夹并解决了问题。
user1619480

谢谢,也为我工作,只是删除bin文件夹。
饼干狗

对我来说,删除bin文件夹就足够了。出乎意料的是,在没有成功之前,我尝试过使用干净的解决方案重建解决方案。有时候有点奇怪。
狮子


22

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


由于存在此问题,我们只是迁移到其他服务器,原因是我们保留了备份。删除备份副本后有效。谢谢:)
杰塔克18/12/29

22

我现在要打动大家。。。

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

Get-Project -All | Add-BindingRedirect

也为我工作。谢谢
Oleh Udovytskyi

你救了我的时间👌👌
阿卜杜·伊玛目

4
这仅在软件包管理格式为packages.config时有效,如果您使用的是不带packages.config的2017 csproj,它将起作用:(
ManiVI

1
头脑正式被吹
BGilman

那是一个不错的小把戏
hexagod

21

我添加了一个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>

卸载软件包时应恢复为的状态:

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>

我已经看到了,至少在使用NuGet时对于Entity Framework模块而言,如果右键单击解决方案,请转到“管理解决方案的NuGet软件包”,然后选择“已安装的软件包”>“全部”,选择该模块,选择“管理”,即可通常从您的项目中取消选择它。这应该清理掉这样的事情,而不必手动进行---假设供应商做了尽职调查。但是,如果您将其删除,那么好捕获有时有时就不会捕获。
vapcguy 2014年

20

就我而言,此错误是在运行ASP.NET应用程序时发生的。解决方案是:

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

清理不起作用,重建不起作用,所有引用都很好,但是它不是在编写其中一个库。删除这些目录后,一切正常。


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

也为我工作。仍然不确定为什么这行得通:(
KangarooWest

14

在我的情况下,它是C:\ WINDOWS \ Microsoft.NET \ Framework \〜\ Temporary ASP.NET Files \目录中的DLL的旧版本。您可以删除或替换旧版本,也可以删除并将引用添加回项目中。基本上,任何一种方法都会创建一个指向临时ASP.NET文件的新指针。


2
当我关闭Visual Studio,停止IIS并删除所有临时ASP.NET文件时,这对我有用。请注意,如果在64位计算机上,则在Framework和Framework64文件夹中以及.NET 2.0和4.0文件夹中都可以包含文件!
Bryan B

我使用Windows的“开始”菜单搜索功能来查找由我的解决方案创建的所有DLL,然后将所有DLL删除,无论在哪里找到它们。我可以不用担心,因为它们只能在Visual Studio调试期间创建。由于VS将重建丢失的DLL,并且我的解决方案之外的任何内容都不应引用它们,因此对我来说这是一个“安全”的操作。
扎里菲斯2014年

8

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

令人讨厌的部分是,错误消息没有指出导致问题的引用。


2
就我而言,升级到新的DevExpress版本后,表单的.resx文件包含对旧的卸载库版本的引用。我必须在代码视图中打开.resx,然后将版本更正为新版本或删除无效条目。
Artemix

5

如果尝试使用反射后期绑定,绑定的程序集具有强名称或更改了其公钥令牌,则会引发完全相同的错误。即使实际上没有找到具有指定公钥令牌的程序集,该错误也是相同的。

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


1
请详细说明-什么是“ sn -T”?在哪里添加公钥令牌?
莫里茨俩2010年

3
“ sn.exe”是Visual Studio附带的工具,它是可以从Visual Studio命令提示符运行的命令行工具。只需运行Visual Studio命令提示符(从开始菜单),导航到包含程序集的文件夹,然后键入“ sn -T <assembly>”,其中<assembly>是dll的全名。这将获取程序集的“令牌”信息。完成此操作后,当您使用反射进行后期绑定时,将令牌信息输入到程序集ID字符串中(即,“ Assembly = MyAssembly.dll,公钥令牌= <token guid>”)
Guy Starbuck

2
感谢您的回答。在我的App.ini中引用配置部分时出现此错误。我最近对程序集进行了签名,因此必须使用新的(正确的)令牌更新PublicKeyToken = null。
利亚姆

5

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

最终结果:直接引用(1)和间接引用(2)指向客户端计算机上已更改dll的不同版本。在我的开发机器上,它运行良好。

解决方法:删除应用程序;从应用程序文件夹中删除所有DLLS;重新安装,就像我的情况一样简单。


4

我会让别人从我的愚蠢行为中受益。我对一个完全独立的应用程序有一些依赖关系(我们称之为App1)。该App1中的dll被拉到我的新应用程序(App2)中。每当我在APP1中进行更新时,我都必须创建新的dll并将其复制到App2中。好。。我厌倦了在2个不同的App1版本之间进行复制和粘贴的操作,因此我只是在dll的前缀中添加了“ NEW_”前缀。

好。。。我猜想构建过程会扫描/ bin文件夹,当它不正确地匹配某些内容时,它会发出与上述相同的错误消息。我删除了“ new_”版本,但它的构建只是花花公子。


4

我的问题是将源代码复制到新计算机上,而没有移出任何引用的程序集。

我没有解决该错误,因此,我急忙删除了BIN目录。重建了我的源代码,从此以后一直有效。


4

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

为了解决这个问题,我做了一个 Update-Package并清理了解决方案以进行全面重建。

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


1
对我来说,类似的答案。 Update-Package -reinstall重新安装所有相同版本的NuGet软件包。
杰西(Jess)

1
这很棒; 感谢您的发布。我尝试了所有其他好的建议,但这就是解决问题的办法。谢天谢地,即使仍然有80个可用的解决方案,他们仍然愿意发布替代解决方案的人
Hambone

4

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

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


另一种方法是单击“管理解决方案的NuGet软件包...”,然后将测试项目和被测试项目都更新为相同(最新)版本。
lixonn

4

我的app.config包含一个

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.11.0"/>

对于npgsql。以某种方式在用户计算机上,我的app.exe.config丢失了。我不确定这是一个愚蠢的用户,安装程序出现故障还是淘汰了防病毒软件。替换文件解决了该问题。


3

我只是找到了收到此错误的另一个原因。我从特定库的所有版本中清除了GAC,并参考与可执行文件一起部署的特定版本来构建我的项目。运行项目时,出现此异常,正在搜索库的较新版本。

原因是发布者的政策。当我从GAC卸载库的版本时,我也忘记了卸载发布者策略程序集,因此,程序加载器没有使用本地部署的程序集,而是在GAC中找到了发布者策略,该策略要求它搜索新版本。


3

对我来说,“ Local.testtesttings”文件中的代码覆盖率配置“引起”了问题。我忘了更新那里引用的文件。


3

只需删除项目的bin文件夹中的内容并重建解决方案即可解决我的问题。


1
那么你知道什么,你就帮我走出我的痛苦,真是太感谢您
罗尼马赫兰古

2

清理并重建解决方案可能不会替换输出目录中的所有dll。

我的建议是尝试将文件夹从“ bin”重命名为“ oldbin”或将“ obj”重命名为“ oldobj”

然后尝试重新建立您的解决方案。

如果您使用的是第三方dll,则在成功构建后需要将其复制到新创建的“ bin”或“ obj”文件夹中。

希望这对您有用。


1

从文件夹位置手动删除旧程序集,然后将引用添加到新程序集可能会有所帮助。


1

我遇到了同样的错误...就我而言,它如下解决:

  • 刚安装应用程序时,这里的人们在应用程序中使用了Microsoft Enterprise Library 4.1。
  • 在前一周,我的机器被格式化了,而今天之后,当我构建该应用程序时,它给了我一个错误,即企业库程序集丢失了。
  • 然后,我安装了Microsoft Enterprise Library 5.0,该产品是我在Google上获得的第一个搜索条目。
  • 然后,当我构建应用程序时,它给了我上面的错误,即所定位的程序集的清单定义与程序集引用不匹配。
  • 经过大量搜索和分析,我发现应用程序引用了4.1.0.0,而bin文件夹中的DLL版本为5.0.0.0。
  • 然后我要做的是安装了Microsoft Enterprise Library 4.1。
  • 删除了以前的参考(5.0)并添加了4.0参考。
  • 构建了应用程序,瞧……它起作用了。

1

这是我解决此问题的方法。

  1. 从异常消息中,获取“问题”库的名称和“预期”版本号。

在此处输入图片说明

  1. 在您的解决方案中找到该.dll的所有副本,右键单击它们,然后检查它是哪个版本的.dll。

在此处输入图片说明

好的,因此在此示例中,我的.dll绝对是2.0.5022.0(因此Exception版本号错误)。

  1. 搜索解决方案中所有.csproj文件中“异常”消息中显示的版本号。将此版本号替换为dll中的实际编号。

因此,在此示例中,我将替换它...

<Reference Include="DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

... 有了这个...

<Reference Include="DocumentFormat.OpenXml, Version=2.0.5022.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

任务完成 !


如果我的csproj文件没有引用版本怎么办?
约翰·德米特里

1

就我而言,问题出在椅子和键盘之间:-)

Could not load file or assembly 'DotNetOpenAuth.Core, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=2780ccd10d57b246' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)

两个或多个不同的程序集希望使用不同版本的DotNetOpenAuth库,这不会有问题。此外,在我的本地计算机上,NuGet自动更新了一个web.config:

<dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
    </dependentAssembly>
    <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
</dependentAssembly>

然后我意识到我忘了将新的web.config复制/部署到生产服务器。因此,如果您具有手动部署web.config的方式,请检查它是否已更新。如果生产服务器的web.config完全不同,则必须在使用NuGet之后同步合并这些dependentAssembly部分。


1

如果您收到诸如“ 找到的程序集的清单定义与程序集引用不匹配类的错误,并且您已通过VS中的“项目”>“管理NuGet程序包和更新”选项卡进行了更新,那么您可以做的第一件事就是尝试安装该程序的另一个版本从NuGet Gallery页面检查版本并从Package Manager控制台运行以下命令后,请执行以下操作:

PM> Install-Package YourPackageName -Version YourVersionNumber 
//Example
PM> Install-Package Microsoft.Extensions.FileProviders.Physical -Version 2.1.0

尽管答案与所讨论的软件包没有直接关系,并且已经被问到了答案,但它是通用的,仍然很相关,希望对您有所帮助。


1

没有解决方案对我有用。我尝试了干净的项目解决方案,删除了bin,更新了程序包,将程序包降级,等等。。。两个小时后,我从带有程序集的项目中加载了默认的App.config,然后我从以下位置更改了错误的参考版本:

<dependentAssembly>
    <assemblyIdentity name="Microsoft.IdentityModel.Logging" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
</dependentAssembly>

至:

<dependentAssembly>
    <assemblyIdentity name="Microsoft.IdentityModel.Logging" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-3.14.0.0" newVersion="5.5.0.0" />
</dependentAssembly>

在此之后,我清理了项目,再次构建它,它开始工作了。没有警告没问题。


0

由于引用了与我正在构建的程序集同名的程序集,因此我收到此错误消息。

编译后,但是使用当前项目程序集覆盖了引用的程序集-从而导致错误。

要修复它,我更改了项目的名称,并通过右键单击项目并选择“属性”来使用装配属性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.