我正在尝试在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文件的旧版本的内容,有什么建议吗?

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


当前回答

我在开始使用InstallShield后遇到了这个问题。尽管建造订单显示安装项目是最后一个,但它的建造仍不正常。

我纠正了这一点,使每个其他项目都依赖它-这迫使安装最后构建,从而消除了我的程序集不匹配。我希望这有帮助。

其他回答

在我的单元测试项目中也出现了同样的错误,导致一些测试失败。我仔细检查了我在程序集资源管理器中使用的程序集的哪个版本,并检查了运行时/依赖程序集标记的内容,发现我使用的程序集中的另一个版本仍然在那里被引用。因为这是我的测试项目app.config中的唯一指令,所以我尝试删除整个app.config文件,重新构建解决方案,这就成功了!我没有更多参考错误:)

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

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

尝试从webConfig/appConfig中删除程序集引用

 <dependentAssembly>
        <assemblyIdentity name="System.IO" publicKeyToken="B03F5F7F11D50A3A" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.3.0.0" />
      </dependentAssembly>

右键单击VS中的引用,将“特定版本”属性设置为True。