我试图在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中的x.Foo.Foo2(String groupName_):第123行
在FooTests.cs中的x.Foo.UnitTests.FooTests.TestFoo():第98行**
System.IO.FileLoadException:无法加载文件或程序集'Utility,Version = 1.2.0.203,Culture = neutral,PublicKeyToken = 764d581291d764f7'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
我查看我的参考资料,我只参考Utility version 1.2.0.203
(另一个是旧的).
关于我如何弄清楚试图引用这个旧版本的DLL文件的任何建议?
此外,我认为我的硬盘上甚至没有这个旧组件.有没有工具可以搜索这个旧的版本化程序集?
.NET程序集加载程序无法找到1.2.0.203,但确实找到了1.2.0.200.此程序集与请求的内容不匹配,因此您收到此错误.简单来说,它找不到引用的程序集.通过将其放入GAC或应用程序路径,确保它可以找到正确的程序集.另请参阅http://blogs.msdn.com/junfeng/archive/2004/03/25/95826.aspx.
您可以执行以下操作来解决此问题.首先,使用Windows文件搜索在硬盘驱动器中搜索程序集(.dll).获得结果列表后,执行查看 - >选择详细信息...,然后选中"文件版本".这将在结果列表中显示版本号,以便您可以查看旧版本的来源.
此外,像Lars所说,检查您的GAC以查看其中列出的版本.此Microsoft文章声明在GAC中找到的程序集在构建期间不会在本地复制,因此您可能需要在执行重建之前删除旧版本.(有关创建批处理文件的说明,请参阅我对此问题的回答)
如果仍然无法确定旧版本的来源,可以使用Visual Studio附带的fuslogvw.exe应用程序来获取有关绑定失败的更多信息.Microsoft 在此处提供有关此工具的信息.请注意,您必须通过将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog
注册表项设置为1 来启用日志记录.
我自己也遇到了这个问题,我发现这个问题与其他问题不同.
我有两个我的主项目引用的DLL:CompanyClasses.dll和CompanyControls.dll.我收到运行时错误说:
无法加载文件或程序集'CompanyClasses,Version = 1.4.1.0,Culture = neutral,PublicKeyToken = 045746ba8544160c'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配
麻烦的是,我的系统上没有任何CompanyClasses.dll文件,版本号为1.4.1.GAC中没有,app文件夹中没有...没有任何地方.我查了整个硬盘.我拥有的所有CompanyClasses.dll文件都是1.4.2.
我发现,真正的问题是CompanyControls.dll引用了CompanyClasses.dll的1.4.1版本.我刚刚重新编译了CompanyControls.dll(在它引用了CompanyClasses.dll 1.4.2之后),这个错误就此消失了.
以下内容将任何程序集版本重定向到3.1.0.0版.我们有一个脚本,它将始终在App.config中更新此引用,因此我们永远不必再次处理此问题.
通过反射,您可以获取程序集publicKeyToken并从.dll文件本身生成此块.
请注意,如果没有XML命名空间属性(xmlns),这将不起作用.
如果您使用的是Visual Studio,请尝试"清理解决方案",然后重建项目.
其他答案对我不起作用.如果你不关心版本而你只想要你的应用程序运行,那么右键单击引用并将"特定版本"设置为false ...这对我有用.
我刚遇到这个问题,问题是我的应用程序调试目录中有.dll的旧副本.您可能还想检查那里(而不是GAC),看看你是否看到它.
我添加了一个NuGet包,只是为了实现我的应用程序的黑盒部分引用了旧版本的库.
我删除了包并引用了旧版本的静态DLL文件,但是web.config文件从未更新过:
当我卸载软件包时应该恢复到的内容:
在我的例子中,运行ASP.NET应用程序时发生此错误.解决方案是:
删除项目文件夹中的obj
和bin
文件夹
干净不起作用,重建不起作用,所有引用都很好,但它没有编写其中一个库.删除这些目录后,一切都很完美.
我现在要打动大家。。。
从您的.config文件中删除所有引用,然后从NuGet软件包管理器控制台中运行以下命令:
Get-Project -All | Add-BindingRedirect
在我的例子中,它是C:\ WINDOWS\Microsoft.NET\Framework \〜\ Temporary ASP.NET Files \目录中的旧版DLL.您可以删除或替换旧版本,也可以删除并添加对项目中DLL的引用.基本上,无论哪种方式都会创建一个指向临时ASP.NET文件的新指针.
对我们来说,问题是由其他原因造成的.DevExpress组件的许可证文件包括两行,一行用于此特定计算机上未安装的旧版本组件.从许可证文件中删除旧版本解决了该问题.
令人讨厌的部分是错误消息没有给出引起问题的引用的指示.
如果您尝试使用反射进行后期绑定,如果您要绑定的程序集获得强名称或更改了其公钥标记,则会引发完全相同的错误.即使实际上没有找到使用指定公钥令牌的任何程序集,错误也是相同的.
您需要添加正确的公钥令牌(您可以使用dll上的sn -T获取它)来解决错误.希望这可以帮助.
我的情况与内森贝德福德的情况非常相似,但略有不同.我的项目也以两种方式引用了更改后的dll.1)直接和2)间接引用一个组件(类库),该组件本身具有对已更改的dll的引用.现在我的组件(2)的Visual Studio项目引用了更改后的dll的正确版本.但是,组件本身的版本号未更改.因此,安装新版本的项目无法替换客户端计算机上的该组件.
最终结果:直接引用(1)和间接引用(2)指向客户端计算机上已更改的dll的不同版本.在我的开发机器上它工作正常.
解决方案:删除申请; 从应用程序文件夹中删除所有DLLS; 重新安装.就像我的情况一样.