我试图在 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应用程序时发生此错误。 解决方案是:

  1. 删除项目文件夹中的objbin文件夹
  2. 清理不起作用,重建不起作用,所有引用都很好,但它没有编写其中一个库。删除这些目录后,一切都运行良好。

在我的例子中,它是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 参考。
  • 构建了应用程序,瞧...它成功了。

这是解决此问题的方法。

  1. 从异常消息中获取<!>“问题<!>”的名称。 library和<!> quot; expected <!> quot;版本号。
    1. 在解决方案中找到该.dll的所有副本,右键单击它们,然后检查它的.dll版本。
    2. 好的,所以在这个例子中,我的.dll肯定是2.0.5022.0(所以Exception版本号错了)。

      1. 搜索解决方案中所有 .csproj 文件的“例外”消息中显示的版本号。将此版本号替换为dll中的实际数字。
      2. 所以,在这个例子中,我会替换它......

        <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中,使用固定版本号而不是指定*。 *将更改每个编译的版本号。在我的情况下,这就是这个例外的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top