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

System.IO.FileLoadException:未能加载文件或程序集“Utility,Version=1.2.0.200,Culture=neutral,PublicKeyToken=764d581291d764f7”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT的异常:0x80131040)**位于x.Foo.FooGO()位于Foo.cs:line 123中的x.Foo.Foo2(String groupName_)位于FooTests.cs:line 98中的x.Foo.UnitTests.FooTests.TestFoo()**System.IO.FileLoadException:未能加载文件或程序集“Utility,Version=1.2.0.203,Culture=neutral,PublicKeyToken=764d581291d764f7”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT的异常:0x80131040)

我查阅了我的参考资料,我只参考了实用程序版本1.2.0.203(另一个是旧版本)。

关于我如何找出试图引用此DLL文件的旧版本的内容,有什么建议吗?

此外,我想我的硬盘上甚至没有这个旧组件。是否有任何工具可以搜索此旧版本的程序集?


当前回答

与“文件资源管理器”>“属性”>“详细信息”选项卡中的版本相比,.DLL在代码中使用反射的“版本”属性报告不同的版本并不罕见。

多年来,我发现使用这种powershell可以更好地找到应该将绑定重定向设置到哪个版本。

[Reflection.AssemblyName]::GetAssemblyName('C:\Source\Project\Web\bin\System.Memory.dll').Version

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      1      2

通过以上步骤,我可以在app.config文件中插入(或替换)绑定重定向:

<dependentAssembly>
    <assemblyIdentity name="System.Memory" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51"/>
    <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2"/>
</dependentAssembly>

在该特定示例中,System.Memory.dll的“详细信息”选项卡报告的文件版本为4.6.31308.01。

其他回答

尝试将缺少的内容添加到全局程序集缓存中。

运行迁移器以从使用packages.config升级到PackageReference,为我轻松修复了此错误。如果您运行的是Visual Studio 2017 15.7版或更高版本,您可以按照以下步骤进行升级。

https://learn.microsoft.com/en-us/nuget/consume-packages/migrate-packages-config-to-package-reference#migration-步骤

以下是步骤(从上述链接复制):

使用packages.config打开包含项目的解决方案。在解决方案资源管理器中,右键单击“引用”节点或packages.config文件,然后选择将packages.cnfig迁移到程序包参考。。。。迁移器分析项目的NuGet包引用和尝试将它们分类为顶级依赖项(NuGet直接安装的软件包)和Transitive依赖项(作为顶级包的依赖项安装的包)。注意:PackageReference支持可传递的包还原和解析依赖关系是动态的,这意味着传递依赖关系需要不能显式安装。(可选)您可以选择将NuGet包分类为通过选择程序包的顶层选项。此选项自动设置为包含不流动的资产的包(build、buildCrossTargeting、contentFiles或分析器文件夹)和标记为开发依赖项(developmentDependency=“真”)。检查所有程序包兼容性问题。选择“确定”开始迁移。在迁移结束时,Visual Studio提供了一个带有备份路径、已安装软件包的列表(顶级依赖项),引用为可传递的包列表依赖关系,以及在开始迁移。报告将保存到备份文件夹中。验证解决方案是否构建并运行。如果您遇到问题,在GitHub上提交问题。

我的问题是将源代码复制到一台新机器上,而不覆盖任何引用的程序集。

我没有采取任何措施来纠正错误,所以匆忙中,我删除了BIN目录。重新构建了我的源代码,从那时起就开始工作了。

我在运行单元测试用例时遇到了同样的问题。

错误清楚地说明了问题:当我们尝试加载程序集时,.NET程序集加载器会根据其清单数据(引用的程序集名称、公钥令牌、版本)加载其引用的程序。

要检查清单数据,请执行以下操作:

打开Visual Studio命令提示符,键入“ildasm”并将所需的程序集拖到ildasm窗口并打开MANIFEST视图。有时MANIFEST包含一个具有两个版本的程序集,即旧版本和新版本(如Utility,版本=1.2.0.200和Utility,版本=1.2.0203)。实际上,引用的程序集是Utility,版本为1.2.0.203(新版本),但由于清单甚至包含Utility,版本=1.2.0.200(旧版本),.NET程序集加载器尝试查找此版本的DLL文件,找不到,因此引发异常。

要解决这个问题,只需将每个依赖于项目的程序集分别拖到ILDASM窗口中,并检查哪个依赖程序集保存旧程序集版本的清单数据。只需重新生成此依赖程序集并将其引用回项目。

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

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

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

好的,在这个例子中,我的.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" />

工作完成!