当前位置:  开发笔记 > 编程语言 > 正文

定位的程序集的清单定义与程序集引用不匹配

如何解决《定位的程序集的清单定义与程序集引用不匹配》经验,为你挑选了14个好方法。

我试图在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文件的任何建议?

此外,我认为我的硬盘上甚至没有这个旧组件.有没有工具可以搜索这个旧的版本化程序集?



1> Lars Truijen..:

.NET程序集加载程序无法找到1.2.0.203,但确实找到了1.2.0.200.此程序集与请求的内容不匹配,因此您收到此错误.简单来说,它找不到引用的程序集.通过将其放入GAC或应用程序路径,确保它可以找到正确的程序集.另请参阅http://blogs.msdn.com/junfeng/archive/2004/03/25/95826.aspx.


确切地说 - 它正在寻找*1.2.0.203,但它*发现*1.2.0.200.找出该文件的位置,并用正确的版本替换它.
我在这里问了一个类似的问题,得到了一个有效的解决方案:http://stackoverflow.com/questions/4187907/net-picking-wrong-referenced-assembly-version
但是当我看到项目的参考时,它指向1.2.0.203 .. 似乎没有任何东西指向1.2.0.200了
检查引用版本,然后在packages.config和Web.config中查看它是否相同
每次,这条消息使我感到困惑。它似乎是向后写的。我希望它抱怨您要求加载的版本,而不是它找到的版本。很高兴我不是唯一理解错误的人!

2> Seth Petry-J..:

您可以执行以下操作来解决此问题.首先,使用Windows文件搜索在硬盘驱动器中搜索程序集(.dll).获得结果列表后,执行查看 - >选择详细信息...,然后选中"文件版本".这将在结果列表中显示版本号,以便您可以查看旧版本的来源.

此外,像Lars所说,检查您的GAC以查看其中列出的版本.此Microsoft文章声明在GAC中找到的程序集在构建期间不会在本地复制,因此您可能需要在执行重建之前删除旧版本.(有关创建批处理文件的说明,请参阅我对此问题的回答)

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


不要忘记文件版本不是程序集标识的一部分.程序集版本是,但不必与文件版本相同!

3> Nathan Bedfo..:

我自己也遇到了这个问题,我发现这个问题与其他问题不同.

我有两个我的主项目引用的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之后),这个错误就此消失了.



4> Yaniv.H..:

以下内容将任何程序集版本重定向到3.1.0.0版.我们有一个脚本,它将始终在App.config中更新此引用,因此我们永远不必再次处理此问题.

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


 
    
    
  

请注意,如果没有XML命名空间属性(xmlns),这将不起作用.



5> 小智..:

如果您使用的是Visual Studio,请尝试"清理解决方案",然后重建项目.


这通常是我的解决方案.通常,删除`bin`和`obj`就可以了.基本上,我曾经参考的东西仍然坐在那里试图满足相同的要求.例如,旧版本是我直接引用的,新版本是在NuGet上.
为我工作.删除了bin amd obj文件夹并解决了问题.

6> RayLoveless..:

其他答案对我不起作用.如果你不关心版本而你只想要你的应用程序运行,那么右键单击引用并将"特定版本"设置为false ...这对我有用. 在此输入图像描述


该设置仅在*编译时*生效.在编译之后,它将需要与您编译它的完全相同的程序集版本.请参见http://stackoverflow.com/questions/24022134/how-exactly-does-the-specific-version-property-of-an-assembly-reference-work-i

7> 小智..:

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



8> frattaro..:

我添加了一个NuGet包,只是为了实现我的应用程序的黑盒部分引用了旧版本的库.

我删除了包并引用了旧版本的静态DLL文件,但是web.config文件从未更新过:


    
    

当我卸载软件包时应该恢复到的内容:


    
    



9> Levi Fuller..:

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

    删除项目文件夹中的objbin文件夹

干净不起作用,重建不起作用,所有引用都很好,但它没有编写其中一个库.删除这些目录后,一切都很完美.


谢谢,李维·富勒。这个答案应该更高。对于我的情况,这是现场!对我来说,当我制作web.config的备份副本时,即使我删除了重复的副本,Visual Studio仍在加载此配置文件而不是实际的配置,此错误开始。这解决了。谢谢。

10> codeMonkey..:

我现在要打动大家。。。

从您的.config文件中删除所有引用,然后从NuGet软件包管理器控制台中运行以下命令:

Get-Project -All | Add-BindingRedirect


这仅在软件包管理格式为packages.config时有效,如果您使用的是不带packages.config的2017 csproj,它将起作用:(

11> Glade Mellor..:

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


当我关闭Visual Studio,停止IIS并删除所有临时ASP.NET文件时,这对我有用.请注意,如果在64位计算机上以及.NET 2.0和4.0文件夹中,Framework和Framework64文件夹中可能存在文件!

12> Sire..:

对我们来说,问题是由其他原因造成的.DevExpress组件的许可证文件包括两行,一行用于此特定计算机上未安装的旧版本组件.从许可证文件中删除旧版本解决了该问题.

令人讨厌的部分是错误消息没有给出引起问题的引用的指示.


在我的例子中,在升级到新的DevExpress版本之后,表单的.resx文件包含对旧的未安装的库版本的引用.我必须在代码视图中打开.resx并将版本更正为新版本或删除无效条目.

13> Guy Starbuck..:

如果您尝试使用反射进行后期绑定,如果您要绑定的程序集获得强名称或更改了其公钥标记,则会引发完全相同的错误.即使实际上没有找到使用指定公钥令牌的任何程序集,错误也是相同的.

您需要添加正确的公钥令牌(您可以使用dll上的sn -T获取它)来解决错误.希望这可以帮助.


"sn.exe"是Visual Studio附带的工具,它是一个可以从Visual Studio命令提示符运行的命令行工具.只需运行Visual Studio命令提示符(从开始菜单),导航到包含程序集的文件夹,然后键入"sn -T ",其中是dll的全名.这将获得程序集"令牌"信息.完成此操作后,当您使用反射进行后期绑定时,请将令牌信息输入到程序集ID字符串中(即"Assembly = MyAssembly.dll,Public Key Token = ")
谢谢你的回答.我在App.ini中引用配置部分时遇到此错误.我最近签署了程序集,因此必须使用新的(正确的)令牌更新PublicKeyToken = null.

14> Bijimon..:

我的情况与内森贝德福德的情况非常相似,但略有不同.我的项目也以两种方式引用了更改后的dll.1)直接和2)间接引用一个组件(类库),该组件本身具有对已更改的dll的引用.现在我的组件(2)的Visual Studio项目引用了更改后的dll的正确版本.但是,组件本身的版本号未更改.因此,安装新版本的项目无法替换客户端计算机上的该组件.

最终结果:直接引用(1)和间接引用(2)指向客户端计算机上已更改的dll的不同版本.在我的开发机器上它工作正常.

解决方案:删除申请; 从应用程序文件夹中删除所有DLLS; 重新安装.就像我的情况一样.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有