定位的程序集清单定义与程序集引用不匹配
我想在C#Windows窗体应用程序(Visual Studio 2005)中运行一些unit testing,我得到以下错误:
System.IO.FileLoadException:无法加载文件或程序集“Utility,Version = 1.2.0.200,Culture = neutral,PublicKeyToken = 764d581291d764f7”或其某个依赖项。 定位的程序集清单定义与程序集引用不匹配。 (来自HRESULT的exception: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的exception:0x80131040)
我看我的参考,我只有参考Utility version 1.2.0.203
(另一个是旧的)。
任何build议如何找出什么是试图引用这个旧版本的DLL文件?
另外,我觉得我的硬盘上没有这个旧的组件。 有什么工具可以search这个旧版本的程序集吗?
.NET程序集加载器无法find1.2.0.203,但确实find了1.2.0.200。 这个程序集不符合要求,因此你得到这个错误。 简而言之,它找不到被引用的程序集。 确保它可以通过将其放在GAC或应用程序path中find正确的组件。 另见http://blogs.msdn.com/junfeng/archive/2004/03/25/95826.aspx 。
您可以做几件事来解决这个问题。 首先,使用Windows文件search来search您的硬盘驱动器(.dll)。 一旦你有一个结果列表,做查看 – >select细节…,然后检查“文件版本”。 这将在结果列表中显示版本号,以便您可以看到旧版本可能来自何处。
另外,就像Lars说的那样,检查你的GAC,看看那里列出了哪些版本。 这篇Microsoft文章指出,在GAC中find的程序集在构build期间不会在本地复制,因此在重build所有程序之前,可能需要删除旧版本。 (请参阅我的回答这个问题关于创build一个batch file为你做这个注意事项)
如果仍然无法确定旧版本的来源,则可以使用Visual Studio附带的fuslogvw.exe应用程序来获取有关绑定失败的更多信息。 微软在这里有关于这个工具的信息 。 请注意,您必须通过将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog
registry项设置为1来启用日志logging。
我自己也遇到了这个问题,我发现这个问题和别人碰到的不一样。
我有两个我的主要项目引用的DLL:CompanyClasses.dll和CompanyControls.dll。 我得到一个运行时错误说:
无法加载文件或程序集“CompanyClasses,Version = 1.4.1.0,Culture = neutral,PublicKeyToken = 045746ba8544160c”或其某个依赖关系。 定位的程序集清单定义与程序集引用不匹配
麻烦的是,我的系统上没有任何版本号为1.4.1的CompanyClasses.dll文件。 没有在GAC,没有在应用程序文件夹…没有任何地方。 我搜查了我的整个硬盘。 我所有的CompanyClasses.dll文件都是1.4.2。
我发现真正的问题是CompanyControls.dll引用了CompanyClasses.dll的版本1.4.1。 我刚刚重新编译CompanyControls.dll(在参考CompanyClasses.dll 1.4.2后),这个错误消失了。
以下内容将任何程序集版本redirect到版本3.1.0.0,我们有一个脚本,将始终更新App.config中的此引用,因此我们再也不必处理这个问题。 通过reflection你可以得到程序集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),这将无法正常工作。
如果你不关心版本,而只是想让你的应用程序运行,那么右键单击该参考,并将“特定版本”设置为false。 其他解决scheme不适合我。
如果您使用Visual Studio,请尝试“清理解决scheme”,然后重新构build您的项目。
我刚碰到这个问题,问题是我的应用程序debugging目录中有一个旧的.dll副本。 您可能还想检查那里(而不是GAC),看看您是否看到它。
我添加了一个NuGet包,只是为了实现我的应用程序的黑盒部分引用了旧版本的库。
我删除了软件包并引用了旧版本的静态DLL文件,但是web.config文件从未更新过:
<dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="6.0.0.0" /> </dependentAssembly>
到我卸载软件包时应该回复的内容:
<dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.5.0.0" /> </dependentAssembly>
在我的情况下,它是C:\ WINDOWS \ Microsoft.NET \ Framework \〜\ Temporary ASP.NET Files \目录中DLL的旧版本。 您可以删除或replace旧版本,也可以删除并添加对项目中DLL的引用。 基本上,任何一种方式都会创build一个指向临时ASP.NET文件的新指针。
对我们来说,这个问题是由别的东西造成的。 DevExpress组件的许可证文件包含两行,一行用于未安装在此特定计算机上的旧版本组件。 从许可证文件中删除旧版本解决了这个问题。
烦人的部分是错误信息没有提供什么参考导致问题的迹象。
在我的情况下,运行ASP.NET应用程序时发生此错误。 解决scheme是:
- 删除项目文件夹中的
obj
和bin
文件夹
清洁没有工作,重build没有工作,所有的参考文献都很好,但它不是写一个图书馆。 删除这些目录后,一切工作完美。
如果尝试使用reflection进行延迟绑定,并且绑定到的程序集获取了强名称或者更改了公钥标记,则会抛出同样的错误。 即使实际上没有使用指定的公钥标记find任何程序集,错误也是一样的。
你需要添加正确的公钥标记(你可以在dll上使用sn -T来获取它)来解决错误。 希望这可以帮助。
矿山与内森·贝德福德(Nathan Bedford)的职位非常相似,但略有转折。 我的项目也以两种方式引用了更改后的dll。 1)直接和2)间接通过引用一个组件(类库),它本身有一个引用到已更改的DLL。 现在我的组件(2)的Visual Studio项目引用了正确版本的更改的DLL。 然而,compnent本身的版本号没有改变。 因此,新版本的项目安装无法replace客户机上的组件。
最终结果:直接引用(1)和间接引用(2)指向客户端计算机上已更改的dll的不同版本。 在我的开发机器上,它工作得很好。
解决方法:删除应用 从应用程序文件夹中删除所有的DLLS; 在我的情况下,重新安装。
我会让别人从我的剪切愚蠢中受益。 我有一些完全独立的应用程序的依赖(我们称之为App1)。 从App1的DLL被拉到我的新应用程序(App2)。 任何时候我在APP1做更新,我必须创build新的DLL,并将其复制到App2。 好。 。 。我厌倦了复制和粘贴2个不同的App1版本,所以我只是给dll添加了一个“NEW_”前缀。
好。 。 。 我猜测构build过程会扫描/ bin文件夹,当它错误地匹配某个东西时,它会用上面提到的相同的错误信息来parsing。 我删除了我的“new_”版本,它只是build立了花花公子。
我的问题是复制源代码到一台新的机器,没有拉过任何引用的程序集。
没有什么我修正了这个错误,所以我急着删除了BIN目录。 重新构build我的源代码,并从此工作。
所有上述让我困惑,但是这一个保存我的一天: http : //runtingsproper.blogspot.in/2010/04/solved-located-assemblys-manifest.html
我刚刚发现另一个原因,为什么要得到这个错误。 我从所有版本的特定库中清理了我的GAC,并参考与可执行文件一起部署的特定版本构build了我的项目。 当我运行该项目时,我得到了这个exceptionsearch库的较新版本。
原因是出版商的政策 。 当我从GAC中卸载了库的版本时,我忘了卸载发布者策略程序集,所以不用使用我的本地部署的程序集,程序集加载程序在GAC中find了发布者策略,告诉它search更新的版本。
对我来说,“Local.testtesttings”文件中的代码覆盖率configuration“引起”了这个问题。 我忘了更新那里引用的文件。
在构buildTeam Foundation Server的构build服务时出现此错误。 事实certificate,我有我的解决scheme中使用与Nuget添加相同的库的不同版本的多个项目。 我用Nuget删除了所有旧版本,并添加了新的作为所有参考。
Team Foundation Server将所有的dll:s放在一个目录中,当然只能有一个特定名称的dll。
我想补充一点,我正在创build一个基本的MVC4项目,并通过Nuget添加了DotNetOpenAuth.AspNet。 我引用Microsoft.Web.WebPages.OAuth的一个不匹配的DLL后,导致了相同的错误
为了解决这个问题,我为整个重build做了一个Update-Package
和清理解决scheme。
那为我工作,是一种懒惰的方式,但时间就是金钱:-P
我想把我的答案扔在一堆,以防万一有人帮助。 我的app.config包含一个
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.11.0"/>
为npgsql。 不知何故,在用户的机器上,我的app.exe.config丢失。 不知道这是一个愚蠢的用户,安装程序故障,或防病毒还没有。 replace文件解决了这个问题。
在AssemblyInfo.cs文件的AssemblyVersion中,使用固定版本号而不是指定*。 *会更改每个编译的版本号。 对我而言,这是个例外。
从文件夹位置手动删除旧的程序集,然后将引用添加到新的程序集可能会有所帮助。
在我的情况下,问题是在椅子和键盘之间:-)
Could not load file or assembly 'DotNetOpenAuth.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
两个或多个不同的程序集想要使用不同版本的DotNetOpenAuth lib,这不会是一个问题。 另外在我的本地计算机上,一个web.config被nuget自动取消:
<dependentAssembly> <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" /> </dependentAssembly>
然后我意识到,我忘了将新的web.config复制/部署到生产服务器。 所以,如果你有手动部署web.config的方式,请检查它是否更新。 如果生产服务器的web.config完全不同,则必须在使用nuget后同步合并这些dependentAssembly部分。
我得到了同样的错误…在我的情况下它得到解决如下:
- 在安装应用程序的时候,这里的人们首先在应用程序中使用了Microsoft Enterprise Library 4.1。
- 在前一周,我的机器被格式化,今天当我build立了这个应用程序,然后它给了我一个错误,企图库程序集丢失。
- 然后,我安装了我在Google上获得的Microsoft Enterprise Library 5.0作为第一个search条目。
- 然后,当我build立应用程序,然后它给了我上面的错误,即所在的程序集清单定义不匹配程序集引用。
- 经过大量的search工作和分析,我发现应用程序是指4.1.0.0和bin文件夹中的DLL是5.0.0.0版本
- 我所做的是我安装了Microsoft企业库4.1。
- 删除了以前的参考(5.0)并添加了4.0参考。
- build立应用程序&瞧…它的工作。
这是我解决这个问题的方法。
- 从exception消息中,获取“问题”库的名称和“预期”版本号。
- 在解决scheme中find该.dll的所有副本 ,右键单击它们,然后检查它是哪个版本的.dll。
好的,在这个例子中,我的.dll肯定是2.0.5022.0(所以Exception版本号是错误的)。
- 在解决scheme中的所有.csproj文件中searchexception消息中显示的版本号。 将此版本号replace为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" />
任务完成 !
由于引用了一个与我正在构build的程序集具有相同名称的程序集,因此我收到了此错误消息。
这编译,但它覆盖与当前的项目程序集引用的程序集 – 从而导致错误。
为了解决这个问题,我通过右击项目并select“属性”来更改项目的名称以及可用的组件属性。
当我尝试更新我的网站的一个DLL时,我有一个类似的问题。
这个错误发生,当我简单地复制这个DLL到bin文件夹通过FTP。
我解决了这个问题:
- 停止网站;
- 复制所需的DLL / DLL;
- 开始网站
我在运行unit testing用例时遇到了同样的问题。 错误清楚地表明问题是:当我们尝试加载程序集时,.net程序集加载程序尝试根据其清单数据(引用的程序集名称,公钥标记,版本)加载其引用的程序集。
要检查清单数据:
- 打开visual studio命令提示符,
- 键入“ildasm”并将所需的程序集拖到ILDASM窗口并打开MANIFEST视图。 有时候,MANIFEST包含两个版本的旧版本以及新版本(如
Utility, Version=1.2.0.200
和Utility, Version=1.2.0.203
)。 实际上,被Utility, Version=1.2.0.203(new version)
集是Utility, Version=1.2.0.203(new version)
,但是由于清单包含Utility, Version=1.2.0.200(old version)
,.NET程序集加载器试图找出这个版本化的dll,find并抛出exception。
为了解决这个问题,只需将每个依赖于项目的程序集分别拖放到ILDASM窗口,并检查哪个依赖程序集包含旧程序集版本的清单数据。 只要重build这个相关的程序集,并将其引回您的项目。
我遇到这个问题,而使用一个内部的软件包库。 我已经将主包添加到内部存储库,而不是包的依赖关系。 确保将所有的依赖关系,依赖项的依赖关系,recursion等添加到你的内部仓库中。