我正在尝试在 C# Windows 窗体应用程序 (Visual Studio 2005) 中运行一些单元测试,但出现以下错误:
System.IO.FileLoadException:无法加载文件或程序集“实用程序,版本=1.2.0.200,文化=中性,PublicKeyToken=764d581291d764f7”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 例外:0x80131040)** 在 x.Foo.FooGO() 在 x.Foo.Foo2(String groupName_) 在 Foo.cs:第 123 行在 x.Foo.UnitTests.FooTests.TestFoo() 在 FooTests.cs :第 98 行** System.IO.FileLoadException:无法加载文件或程序集“实用程序,版本 = 1.2.0.203,文化 = 中性,PublicKeyToken = 764d581291d764f7”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040)
我查看了我的参考资料,我只有一个对 Utility version 1.2.0.203
的参考资料(另一个是旧的)。
关于我如何找出试图引用这个 DLL 文件的旧版本的任何建议?
此外,我认为我的硬盘驱动器上什至没有这个旧组件。有什么工具可以搜索这个旧版本的程序集吗?
.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。
您可以做几件事来解决此问题。首先,使用 Windows 文件搜索在硬盘驱动器中搜索程序集 (.dll)。获得结果列表后,执行查看->选择详细信息...,然后检查“文件版本”。这将在结果列表中显示版本号,因此您可以看到旧版本可能来自何处。
另外,就像 Lars 所说,检查您的 GAC 以查看那里列出的版本。 This Microsoft article 指出,在 GAC 中找到的程序集在构建期间不会在本地复制,因此您可能需要在全部重新构建之前删除旧版本。 (有关创建批处理文件为您执行此操作的说明,请参见我对 this question 的回答)
如果您仍然无法确定旧版本的来源,您可以使用 Visual Studio 附带的 fuslogvw.exe 应用程序来获取有关绑定失败的更多信息。 Microsoft 有关于此工具 here 的信息。请注意,您必须通过将 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog
注册表项设置为 1 来启用日志记录。
我自己也遇到了这个问题,我发现这个问题与其他人遇到的问题不同。
我的主要项目引用了两个 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 之后),这个错误对我来说就消失了。
CompanyControls
项目,右键单击 CompanyClasses.dll
引用 -->属性 --> SpecificVersion = false
SpecificVersion = false
不会删除它。您需要一个 bindingredirect
。
以下将任何程序集版本重定向到版本 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,请尝试“干净的解决方案”,然后重新构建您的项目。
bin
和 obj
即可。基本上,我以前引用的东西仍然坐在那里试图满足相同的要求。例如,旧版本是我直接引用的东西,而新版本是在 NuGet 上。
https://i.stack.imgur.com/SUDUK.png
我现在要让每个人都大吃一惊。 . .
从 .config 文件中删除所有 <assemblyBinding>
引用,然后从 NuGet 包管理器控制台运行此命令:
Get-Project -All | Add-BindingRedirect
就我而言,此错误是在运行 ASP.NET 应用程序时发生的。解决方案是:
删除项目文件夹中的obj和bin文件夹
Clean 不起作用,rebuild 不起作用,所有引用都很好,但它没有编写其中一个库。删除这些目录后,一切正常。
我添加了一个 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>
我刚刚遇到了这个问题,问题是我的应用程序调试目录中有 .dll 的旧副本。您可能还想检查那里(而不是 GAC),看看您是否看到它。
在我的情况下,它是 C:\WINDOWS\Microsoft.NET\Framework\~\Temporary ASP.NET Files\ 目录中的旧版本 DLL。您可以删除或替换旧版本,也可以删除并重新添加对项目中 DLL 的引用。基本上,任何一种方式都会创建一个指向临时 ASP.NET 文件的新指针。
对我们来说,问题是由其他原因引起的。 DevExpress 组件的许可文件包括两行,一行用于未安装在此特定计算机上的旧版本组件。从许可证文件中删除旧版本解决了该问题。
烦人的部分是错误消息没有表明是什么引用导致了问题。
我想补充一点,我正在创建一个基本的 ASP.NET MVC 4 项目,并通过 NuGet 添加了 DotNetOpenAuth.AspNet。在我为 Microsoft.Web.WebPages.OAuth 引用了一个不匹配的 DLL 文件后,这导致了同样的错误。
为了修复它,我做了一个 Update-Package
并清理了解决方案以进行完全重建。
这对我有用,有点懒惰,但时间就是金钱:-P
Update-Package -reinstall
重新安装同一版本的所有 NuGet 包。
如果您尝试使用反射进行后期绑定,如果您要绑定的程序集具有强名称或更改了其公钥标记,则会引发完全相同的错误。即使实际上没有找到任何具有指定公钥令牌的程序集,错误也是相同的。
您需要添加正确的公钥令牌(您可以在 dll 上使用 sn -T 获取它)来解决错误。希望这可以帮助。
是否可能您在 assemblyBinding 尝试中有错误的 nugget 版本:
移除 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>
键入包管理器控制台: Add-BindingRedirect 生成所有必要的绑定重定向运行您的应用程序,看看它是否正常工作。如果没有,请添加软件包控制台错过的任何缺少的绑定重定向。
我的问题是将源代码复制到新机器上,而没有拉出任何引用的程序集。
我没有修复错误,所以我匆忙删除了 BIN 目录。重建了我的源代码,从那时起它就可以工作了。
我的情况与 Nathan Bedford 的帖子非常相似,但略有不同。我的项目也以两种方式引用了更改后的 dll。 1)直接和 2)间接通过引用一个组件(类库),该组件本身具有对已更改 dll 的引用。现在我的组件 (2) 的 Visual Studio 项目引用了更改后的 dll 的正确版本。但是组件本身的版本号没有改变。结果,新版本项目的安装未能替换客户端计算机上的该组件。
最终结果:直接引用 (1) 和间接引用 (2) 指向客户端计算机上更改的 dll 的不同版本。在我的开发机器上它运行良好。
解决方案:删除应用程序;从应用程序文件夹中删除所有 DLL;重新安装。在我的情况下很简单。
在 Team Foundation Server 的构建服务上构建时出现此错误。事实证明,我的解决方案中有多个项目,使用的是通过 NuGet 添加的同一库的不同版本。我使用 NuGet 删除了所有旧版本,并添加了新版本作为所有人的参考。
Team Foundation Server 将所有 DLL 文件放在一个目录下,当然每次只能有一个特定名称的 DLL 文件。
我会让别人从我的愚蠢中受益。我对一个完全独立的应用程序有一些依赖项(我们称之为 App1)。该 App1 中的 dll 被拉入我的新应用程序 (App2)。每当我在 APP1 中进行更新时,我都必须创建新的 dll 并将它们复制到 App2 中。出色地。 . .我厌倦了在 2 个不同的 App1 版本之间复制和粘贴,所以我只是在 dll 中添加了一个“NEW_”前缀。
出色地。 . .我猜测构建过程会扫描 /bin 文件夹,当它不正确地匹配某些内容时,它会发出与上述相同的错误消息。我删除了我的“new_”版本,它只是花花公子。
我的 app.config 包含一个
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.11.0"/>
对于 npgsql。不知何故,在用户的机器上,我的 app.exe.config 丢失了。我不确定它是否是一个愚蠢的用户、安装程序故障,或者是反病毒软件。替换文件解决了这个问题。
在尝试了上述许多没有修复的解决方案之后,它归结为确保在 Visual Studio 的应用程序中打开“自动生成绑定重定向”。
https://i.stack.imgur.com/bXLq6.png
可以在此处找到有关启用自动绑定重定向的更多信息:https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection
我刚刚找到了另一个导致此错误的原因。我从特定库的所有版本中清除了我的 GAC,并参考与可执行文件一起部署的特定版本构建了我的项目。当我运行该项目时,我在搜索更新版本的库时遇到了这个异常。
原因是publisher policy。当我从 GAC 卸载库的版本时,我也忘记卸载发布者策略程序集,因此程序集加载器没有使用我本地部署的程序集,而是在 GAC 中找到了发布者策略,告诉它搜索更新的版本。
对我来说,“Local.testtesttings”文件中的代码覆盖率配置“导致”了这个问题。我忘了更新那里引用的文件。
只需删除项目 bin 文件夹的内容并重建解决方案即可解决我的问题。
此类问题的一般答案是像其他答案一样使用绑定重定向。然而,这只是问题的一部分——您需要知道您正在使用的程序集文件的正确版本。 Windows 属性并不总是准确的,nuget 也不总是准确的。
获得正确版本信息的唯一方法是分析文件本身。一个有用的工具是 dotPeek。根据我的经验,dotPeek 中列出的程序集名称总是准确的。
例如,此文件的正确绑定如下:
<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>
Windows 资源管理器说该文件是 4.6.26515.06,nuget 说它是一个 5.0.0.0 文件。 dotPeek 说它是 4.2.1.0,这是在我们的软件中正常工作的版本。另请注意,公钥和文化很重要,dotPeek 也会显示此信息。
https://i.stack.imgur.com/KcEtq.png
这是我解决此问题的方法。
从异常消息中,获取“问题”库的名称和“预期”版本号。
https://i.stack.imgur.com/8XKgk.png
在您的解决方案中找到该 .dll 的所有副本,右键单击它们,然后检查它是哪个版本的 .dll。
https://i.stack.imgur.com/QxmEp.png
好的,所以在这个例子中,我的 .dll 肯定是 2.0.5022.0 (所以异常版本号是错误的)。
搜索解决方案中所有 .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" />
任务完成 !
问题已经有了答案,但是如果同一解决方案中不同版本的NuGet包出现问题,可以尝试以下方法。
打开 NuGet 包管理器,您会看到我的服务项目版本与其他版本不同。
然后更新包含旧版本包的项目。
https://i.stack.imgur.com/dYt7J.png
清理并重建解决方案可能不会替换输出目录中的所有 dll。
我建议尝试将文件夹从“bin”重命名为“oldbin”或“obj”重命名为“oldobj”
然后再次尝试构建您的解决方案。
如果您使用任何第三方 dll,则需要在成功构建后将其复制到新创建的“bin”或“obj”文件夹中。
希望这对你有用。
没有解决方案对我有用。我尝试了干净的项目解决方案,删除 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>
在此之后,我清理了项目,再次构建它并且它工作。没有警告没有问题。
这个问题很老了,最近我在使用 Azure DevOps Yaml 管道和 Dotnet Core 3.1 时遇到了同样的错误消息。这个问题与尝试解决的其他答案有些不同,所以我将分享我的解决方案。
我为自己的 nuget 包提供了许多项目的解决方案。我偶然在 *.csproj 文件中添加了版本标签,如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Version>1.0.0</Version>
</PropertyGroup>
我使用 Yaml 和 DotnetCoreCLI@2 任务为所有项目打包了 nuget 包:
- task: DotNetCoreCLI@2
displayName: 'pack'
inputs:
command: pack
nobuild: true
configurationToPack: 'Release'
includesource: true
includesymbols: true
packagesToPack: 'MyNugetProject1.csproj;**/MyNugetProject2.csproj'
versioningScheme: 'byEnvVar'
versionEnvVar: 'GitVersion.SemVer'
问题是 *.csproj 文件中的版本与环境变量 GitVersion.SemVer(由 input-"versionEnvVar" 指定)中的版本不匹配。
删除 *.csproj 文件中的所有 <Version>1.0.0</Version>
-tags 后,dll 的程序集/文件版本由环境变量自动分配,并且 nuget 和 dll(程序集/文件版本)将具有相同的版本并解决了问题。