我正在尝试在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文件的旧版本的内容的任何建议?”

需要哪个程序集仍然引用旧的ODATA客户端6.15.0,ildasm帮助我缩小了范围(没有基本代码访问,只能通过服务器上部署的pkg)。

下面的屏幕截图用于快速总结。

DeveloperPackge(如果没有ildasm.exe)https://www.microsoft.com/net/download/visual-studio-sdks

其他回答

这类问题的一般答案是像其他答案一样使用绑定重定向。然而,这只是问题的一部分——您需要知道所使用的程序集文件的正确版本。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也会显示这些信息。

我今天遇到了同样的问题,在我对实体框架进行了更改后,我无法执行添加迁移。

我的解决方案中有两个项目,我们称它们为“客户端”和“数据”,这是一个包含我的EF模型和上下文的类库项目。客户参考了数据项目。

我已经签署了两个项目,然后对EF模型进行了修改。删除签名后,我可以添加迁移,然后可以重新签署项目。

我希望这对某人有用,避免他们长期受挫。。

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

好我猜构建过程会扫描/bin文件夹,当它不正确地匹配某个内容时,会弹出与上面提到的相同的错误消息。我删除了我的“新版本”,它做得很好。

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

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

错误清楚地说明了问题:当我们尝试加载程序集时,.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窗口中,并检查哪个依赖程序集保存旧程序集版本的清单数据。只需重新生成此依赖程序集并将其引用回项目。