admin管理员组

文章数量:1662878

我试图在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文件旧版本的任何建议?

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


#1楼

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

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


#2楼

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

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


#3楼

我的app.config包含一个

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

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


#4楼

以下内容将所有程序集版本重定向到版本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),此功能将无效。


#5楼

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


#6楼

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


#7楼

其他答案对我不起作用。 如果您不关心版本,而只是想运行您的应用程序,则右键单击引用并将“特定版本”设置为false ...这对我有用。


#8楼

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

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

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


#9楼

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

我的主项目引用了两个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之后),这个错误对我来说已经消失了。


#10楼

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

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


#11楼

在AssemblyInfo.cs文件中的AssemblyVersion中,使用固定的版本号而不是指定*。 *将更改每次编译的版本号。 在我的情况下,这就是此异常的问题。


#12楼

.NET程序集加载器:

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

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

简而言之,它找不到所引用的程序集。 通过将其放在GAC或应用程序路径中,确保可以找到正确的程序集。 另请参阅http://blogs.msdn/junfeng/archive/2004/03/25/95826.aspx 。


#13楼

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

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

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


#14楼

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

#15楼

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


#16楼

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

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部分。


#17楼

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

  • 刚安装应用程序时,这里的人们在应用程序中使用了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参考。
  • 构建了应用程序,瞧……它起作用了。

#18楼

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

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


#19楼

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


#20楼

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

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


#21楼

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

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

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


#22楼

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


#23楼

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

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

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


#24楼

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

  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" />

任务完成 !


#25楼

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


#26楼

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

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

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

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

希望这对您有用。


#27楼

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

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

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


#28楼

我现在要打动大家。 。 。

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

Get-Project -All | Add-BindingRedirect

#29楼

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

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

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


#30楼

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

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

本文标签: 程序清单不匹配定义