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

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


当前回答

从文件夹位置手动删除旧程序集,然后将引用添加到新程序集可能会有所帮助。

其他回答

以下命令将任何程序集版本重定向到3.1.0.0版本。我们有一个脚本,它将始终更新App.config中的此引用,因此我们再也不用处理此问题了。

通过反射,您可以获取程序集publicKeyToken,并从.dll文件本身生成此块。

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly>
    <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="3.1.0.0" />
  </dependentAssembly>
</assemblyBinding>

注意,如果没有XML命名空间属性(xmlns),这将无法工作。

如果将AssemblyInfo.cs与AssemblyVersion标记一起使用,并且.csproj文件具有不同的值,也可能发生这种情况。通过匹配AssemblyInfo或一起删除该部分,问题就消失了。

其他答案对我不起作用。如果你不在乎版本,你只是想让你的应用运行,那么右键单击引用并将“特定版本”设置为false。。。这对我有用。

我得到了:

无法加载文件或程序集“XXX new”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(HRESULT的异常:0x80131040)

这是因为我将程序集的名称从XXX.dll更改为XXX-new.dll。将名称还原为原始名称修复了错误。

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