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

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


当前回答

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

其他回答

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

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

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

在解决方案中查找该.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" />

工作完成!

由于引用了与我正在生成的程序集同名的程序集,我收到了此错误消息。

这已编译,但它用当前项目程序集覆盖引用的程序集,从而导致错误。

为了解决这个问题,我更改了项目的名称,并通过右键单击项目并选择“财产”来更改可用的程序集财产。

在Team Foundation Server的生成服务上生成时遇到此错误。结果发现,我的解决方案中有多个项目,使用NuGet添加的同一库的不同版本。我删除了NuGet的所有旧版本,并添加了新版本作为所有版本的参考。

Team Foundation Server将所有DLL文件放在一个目录中,当然,一次只能有一个具有特定名称的DLL文件。

我的app.config包含

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.11.0"/>

对于npgsql。不知怎么的,在用户的计算机上,我的app.exe.config丢失了。我不确定这是否是一个愚蠢的用户,安装程序故障,或是杀毒软件出了问题。替换文件解决了问题。