找到的程序集的清单定义与程序集引用不匹配
-
03-07-2019 - |
题
我试图在 C# Windows 窗体应用程序 (Visual Studio 2005) 中运行一些单元测试,但出现以下错误:
系统.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 行**
系统.IO.FileLoadException:无法加载文件或程序集“Utility,Version=1.2.0.203,Culture=neutral,PublicKeyToken=764d581291d764f7”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT 的异常:0x80131040)
我查看了我的参考资料,我只参考了 Utility version 1.2.0.203
(另一个是旧的)。
关于如何找出试图引用此 DLL 文件的旧版本的内容,有什么建议吗?
此外,我认为我的硬盘上根本没有这个旧程序集。有没有任何工具可以搜索这个旧版本的程序集?
解决方案
.NET程序集加载程序无法找到1.2.0.203,但确实找到了1.2.0.200。此程序集与请求的内容不匹配,因此您收到此错误。简单来说,它找不到引用的程序集。通过将其放入GAC或应用程序路径,确保它可以找到正确的程序集。另请参阅 http://blogs.msdn.com/junfeng/archive /2004/03/25/95826.aspx 。
其他提示
您可以执行以下操作来解决此问题。首先,使用Windows文件搜索在硬盘驱动器中搜索程序集(.dll)。获得结果列表后,请执行查看 - <!> gt;选择详细信息...然后选中<!>“;文件版本<!>”。这将在结果列表中显示版本号,以便您可以查看旧版本的来源。
此外,与Lars一样,请检查您的GAC以查看其中列出的版本。 此Microsoft文章指出在GAC中找到的程序集在构建期间不会在本地复制,因此您可能需要在执行全部重建之前删除旧版本。 (有关创建要执行的批处理文件的说明,请参阅我对此问题的回答这个适合你)
如果仍然无法确定旧版本的来源,可以使用Visual Studio附带的fuslogvw.exe应用程序来获取有关绑定失败的更多信息。 Microsoft有关于此工具的信息此处。请注意,您必须通过将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog
注册表项设置为1来启用日志记录。
我自己遇到了这个问题,我发现这个问题与其他问题不同。
我的主项目引用了两个DLL:CompanyClasses.dll和CompanyControls.dll。我收到运行时错误说:
无法加载文件或程序集 'CompanyClasses,Version = 1.4.1.0, 文化=中性, PublicKeyToken = 045746ba8544160c'或 其中一个依赖项。位于 程序集的清单定义 与程序集引用不匹配
麻烦的是,我的系统上没有任何版本号为1.4.1的CompanyClasses.dll文件。 GAC中没有,app文件夹中没有...没有任何地方。我查了整个硬盘。我拥有的所有CompanyClasses.dll文件都是1.4.2。
我发现,真正的问题是CompanyControls.dll引用了CompanyClasses.dll的1.4.1版本。我刚刚重新编译了CompanyControls.dll(在它引用了CompanyClasses.dll 1.4.2之后),这个错误就此消失了。
以下将任何程序集版本重定向到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),这将无效。
如果您使用的是Visual Studio,请尝试<!>“clean solution <!>”;然后重建你的项目。
其他答案对我不起作用。如果你不关心版本而你只想要你的应用程序运行,那么右键单击引用并将“特定版本”设置为false ...这对我有用。
我刚遇到这个问题,问题是我的应用程序调试目录中有.dll的旧副本。您可能还想检查那里(而不是GAC)以查看是否看到它。
我添加了一个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>
就我而言,运行ASP.NET应用程序时发生此错误。 解决方案是:
- 删除项目文件夹中的
obj
和bin
文件夹
醇>
清理不起作用,重建不起作用,所有引用都很好,但它没有编写其中一个库。删除这些目录后,一切都运行良好。
在我的例子中,它是C:\ WINDOWS \ Microsoft.NET \ Framework \〜\ Temporary ASP.NET Files \目录中的旧版DLL。您可以删除或替换旧版本,也可以删除并添加对项目中DLL的引用。基本上,无论哪种方式都会创建一个指向临时ASP.NET文件的新指针。
我现在要打扰每个人的想法。 。
从.config文件中删除所有<assemblyBinding>
引用,然后从NuGet Package Manager控制台运行此命令:
Get-Project -All | Add-BindingRedirect
对我们来说,问题是由其他原因造成的。 DevExpress组件的许可证文件包括两行,一行用于此特定计算机上未安装的旧版本组件。从许可证文件中删除旧版本解决了该问题。
令人讨厌的部分是错误消息没有说明引起问题的引用。
如果您尝试使用反射进行后期绑定,如果您要绑定的程序集具有强名称或更改了其公钥标记,则会引发完全相同的错误。即使实际上没有找到使用指定公钥令牌的任何程序集,错误也是相同的。
您需要添加正确的公钥令牌(您可以使用dll上的sn -T获取它)来解决错误。希望这会有所帮助。
矿井与Nathan Bedford的职位非常相似,但略有不同。我的项目也以两种方式引用了更改后的dll。 1)直接和2)间接引用一个组件(类库),该组件本身具有对已更改的dll的引用。现在我的组件(2)的Visual Studio项目引用了更改后的dll的正确版本。但是,组件本身的版本号未更改。因此,安装新版本的项目无法替换客户端计算机上的该组件。
最终结果:直接引用(1)和间接引用(2)指向客户端计算机上已更改的dll的不同版本。在我的开发机器上,它运行良好。
决议:删除申请;从应用程序文件夹中删除所有DLLS;重新安装。就像我的情况一样。
我会让某人受益于我的剪切愚蠢。我对一个完全独立的应用程序有一些依赖(让我们称之为App1)。来自该App1的dll被拉入我的新应用程序(App2)。每当我在APP1中进行更新时,我都必须创建新的dll并将它们复制到App2中。好。 。我厌倦了在两个不同的App1版本之间复制和粘贴,所以我只是在dll中加了一个'NEW_'前缀。
好。 。 。我猜测构建过程会扫描/ bin文件夹,当它与错误匹配时,它会使用与上述相同的错误消息进行barfs。我删除了我的<!> quot; new _ <!>版本和它建立只是花花公子。
我的问题是将源代码复制到新机器而不会拉过任何引用的程序集。
我没有做任何事情来修复错误,所以在仓促中,我完全删除了BIN目录。重建了我的源代码,从那时起它就开始工作了。
我想补充说我正在创建一个基本的ASP.NET MVC 4项目,并通过NuGet添加了DotNetOpenAuth.AspNet。在为Microsoft.Web.WebPages.OAuth引用了不匹配的DLL文件后,这导致了同样的错误。
为了解决这个问题,我做了一个Update-Package
并清理了完整重建的解决方案。
这对我有用,并且是一种懒惰的方式,但时间就是金钱:-P
在构建Team Foundation Server的构建服务时出现此错误。原来我在我的解决方案中有多个项目,使用NuGet添加的相同库的不同版本。我用NuGet删除了所有旧版本,并添加了新版本作为所有版本的参考。
Team Foundation Server将所有DLL文件放在一个目录中,当然只能有一个特定名称的DLL文件。
我的app.config包含
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.11.0"/>
表示npgsql。不知何故,在用户的机器上,我的app.exe.config丢失了。我不确定它是否是一个愚蠢的用户,安装程序故障,或尚未解决反病毒。替换文件解决了问题。
我刚刚找到了解决此错误的另一个原因。我从特定库的所有版本清理了我的GAC,并参考与可执行文件一起部署的特定版本构建了我的项目。当我运行项目时,我得到了这个异常,搜索了更新版本的库。
原因是发布商政策。当我从GAC卸载库的版本时,我忘记卸载发布者策略程序集,因此,不使用我本地部署的程序集,程序集加载程序在GAC中找到了发布者策略,告知它搜索更新的版本。
对我来说,<!>“Local.testtesttings <!>”中的代码覆盖率配置; file <!> quot; cause <!> quot;问题。我忘了更新那里引用的文件。
只是删除项目bin文件夹的内容并重建解决方案解决了我的问题。
清理并重建解决方案可能无法替换输出目录中的所有dll。
我建议尝试从<!>“bin <!>”重命名文件夹to <!> quot; oldbin <!> quot;或<!> quot; obj <!> quot;到<!>“oldobj <!>”;
然后尝试再次建立你的silution。
如果您正在使用任何第三方dll,则需要将其复制到新创建的<!>“bin <!>”中;或<!> quot; obj <!> quot;成功构建后的文件夹。
希望这对你有用。
从文件夹位置手动删除旧程序集,然后添加对新程序集的引用可能有所帮助。
我遇到了同样的错误...就我而言,问题解决如下:
- 最初安装该应用程序时,这里的人们在应用程序中使用了 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 参考。
- 构建了应用程序,瞧...它成功了。
这是解决此问题的方法。
- 从异常消息中获取<!>“问题<!>”的名称。 library和<!> quot; expected <!> quot;版本号。 醇>
- 在解决方案中找到该.dll的所有副本,右键单击它们,然后检查它的.dll版本。 醇>
- 搜索解决方案中所有 .csproj 文件的“例外”消息中显示的版本号。将此版本号替换为dll中的实际数字。 醇>
好的,所以在这个例子中,我的.dll肯定是2.0.5022.0(所以Exception版本号错了)。
所以,在这个例子中,我会替换它......
<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" />
完成工作!
在我的情况下,问题出在椅子和键盘之间: - )
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部分。
如果您遇到类似<!>的错误; 找到的程序集的清单定义与程序集引用不匹配 <!>如果您通过 Project <!> gt更新了在VS 中管理NuGet包和更新选项卡,您可以做的第一件事是在检查 NuGet Gallery页面并从Package Manager控制台运行以下命令:
PM> Install-Package YourPackageName -Version YourVersionNumber
//Example
PM> Install-Package Microsoft.Extensions.FileProviders.Physical -Version 2.1.0
虽然答案与有问题的方案没有直接关系,而且它被问到回来了,但它是一种通用的,仍然相关,希望它可以帮助某人。
由于引用了与我正在构建的程序集同名的程序集,因此收到此错误消息。
这已编译,但它用当前项目程序集覆盖了引用的程序集 - 从而导致错误。
要修复它,我通过右键单击项目并选择“属性”来更改项目名称和组件属性。
在AssemblyInfo.cs文件的AssemblyVersion中,使用固定版本号而不是指定*。 *将更改每个编译的版本号。在我的情况下,这就是这个例外的问题。