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

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


当前回答

没有适合我的解决方案。我尝试了清理项目解决方案、删除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>

to:

<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>

在这之后,我清理了这个项目,再次构建它,它成功了。没有警告没有问题。

其他回答

我刚刚遇到了这个问题,问题是我的应用程序调试目录中有一个旧的.dll副本。您可能还想在那里(而不是GAC)查看是否看到它。

您可以做一些事情来解决此问题。首先,使用Windows文件搜索在硬盘上搜索程序集(.dll)。一旦有了结果列表,请执行查看->选择详细信息。。。然后选中“文件版本”。这将在结果列表中显示版本号,因此您可以看到旧版本可能来自何处。

此外,正如Lars所说,检查您的GAC,看看那里列出了什么版本。这篇Microsoft文章指出,在生成过程中,在GAC中找到的程序集不会在本地复制,因此您可能需要在全部重新生成之前删除旧版本。(有关创建批处理文件以执行此操作的说明,请参见我对此问题的回答)

如果仍然无法确定旧版本的来源,可以使用Visual Studio附带的fuslogvw.exe应用程序获取有关绑定失败的详细信息。Microsoft在此处提供了有关此工具的信息。请注意,您必须通过将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog注册表项设置为1来启用日志记录。

在我的案例中,在运行ASP.NET应用程序时发生了此错误。解决方案是:

删除项目文件夹中的obj和bin文件夹

清理不起作用,重建不起作用。所有引用都很好,但它没有编写其中一个库。删除这些目录后,一切都很顺利。

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

好的,再来一个答案。我之前将我的应用程序创建为64位,并相应地更改了输出路径(项目/财产/构建/输出/输出路径)。最近,我将应用程序更改为32位(x86),创建了一个新的输出路径。我创建了一个快捷方式,指向我认为编译的.exe要去的地方。无论我对源代码做了什么更改,它都得到了清单不匹配的错误。在大约一个小时的沮丧之后,我碰巧检查了.exe文件的日期/时间,发现它很旧,显然引用了旧的.dll。我正在将应用程序编译到旧目录中,我的快捷方式引用了新的。已将输出路径更改为.exe应指向的位置,运行快捷方式,错误消失。(拍打前额)