首页 文章

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

提问于
浏览
616

我试图在C#Windows窗体应用程序(Visual Studio 2005)中运行一些单元测试,我收到以下错误:

System.IO.FileLoadException:无法加载文件或程序集'Utility,Version = 1.2.0.200,Culture = neutral,PublicKeyToken = 764d581291d764f7'或其依赖项之一 . 定位的程序集的清单定义与程序集引用不匹配 . (来自HRESULT的异常:0x80131040)位于Foo.cs中x.Foo.Foo2(String groupName_)的x.Foo.FooGO()处:FooTests.cs中x.Foo.UnitTests.FooTests.TestFoo()处的第123行:第98行 System.IO.FileLoadException:无法加载文件或程序集'Utility,Version = 1.2.0.203,Culture = neutral,PublicKeyToken = 764d581291d764f7'或其依赖项之一 . 定位的程序集的清单定义与程序集引用不匹配 . (HRESULT异常:0x80131040)

我查看了我的参考资料,我只提到 Utility version 1.2.0.203 (另一个是旧的) .

关于我如何弄清楚什么是试图引用这个旧版本的DLL文件的任何建议?

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

30 回答

  • 4

    我今天遇到了同样的问题,导致我在实体框架中进行更改后无法执行添加迁移 .

    我在我的解决方案中有两个项目,我们称之为“客户端”和“数据” - 一个包含我的EF模型和上下文的类库项目 . 客户端引用了数据项目 .

    我签了两个项目,后来又对EF模型进行了更改 . 删除签名后,我可以添加迁移,然后可以重新签署项目 .

    我希望这对某些人有用,可以避免长时间的挫折感 .

  • 20

    在Team Foundation Server的构建服务上构建时出现此错误 . 原来我在我的解决方案中有多个项目,使用NuGet添加的同一个库的不同版本 . 一世使用NuGet删除所有旧版本并添加新版本作为所有版本的参考 .

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

  • 5

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

  • 86

    我刚刚发现了另一个导致此错误的原因 . 我从特定库的所有版本清理了我的GAC,并参考与可执行文件一起部署的特定版本构建了我的项目 . 当我运行项目时,我得到了这个异常,搜索更新版本的库 .

    原因是publisher policy . 当我从GAC卸载库版本时,我忘记卸载发布者策略程序集,因此,不是使用我本地部署的程序集,程序集加载程序在GAC中找到了发布者策略,告诉它搜索更新的版本 .

  • 5

    我添加了一个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>
    
  • 0

    在AssemblyInfo.cs文件的AssemblyVersion中,使用固定版本号而不是指定* . *将更改每个编译的版本号 . 在我的案例中,这就是这个例外的问题 .

  • 4

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

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

  • 393

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

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

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

  • 8

    只是删除项目的bin文件夹的内容并重建解决方案解决了我的问题 .

  • 13

    我会让一个人受益于我的剪切愚蠢 . 我对一个完全独立的应用程序有一些依赖(让我们称之为App1) . 来自App1的dll被拉入我的新应用程序(App2) . 每当我在APP1中进行更新时,我都必须创建新的dll并将它们复制到App2中 . 好 . . 我厌倦了在两个不同的App1版本之间复制和粘贴,所以我只是在dll中加了一个'NEW_'前缀 .

    好 . . . 我猜测构建过程会扫描/ bin文件夹,当它与错误匹配时,它会使用与上述相同的错误消息进行barfs . 我删除了我的“new_”版本,它只是花花公子 .

  • 0

    我的问题是将源代码复制到新机器而不会拉过任何引用的程序集 .

    我没有做任何事情来修复错误,所以在仓促中,我完全删除了BIN目录 . 重建我的源代码,从那时起它就开始工作了 .

  • 0

    我在使用内部包存储库时遇到了这个问题 . 我已将主包添加到内部存储库,但不是包的依赖项 . 确保将所有依赖项,依赖项依赖项,递归等添加到内部存储库中 .

  • 1

    我想补充一点,我正在创建一个基本的ASP.NET MVC 4项目,并通过NuGet添加了DotNetOpenAuth.AspNet . 在为Microsoft.Web.WebPages.OAuth引用了不匹配的DLL文件后,这导致了同样的错误 .

    为了解决这个问题,我做了一个 Update-Package 并清理了完整重建的解决方案 .

    这对我有用,并且是一种懒惰的方式,但时间就是金钱:-P

  • 1

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

  • 1

    对我来说,“Local.testtesttings”文件中的代码覆盖率配置“导致”了问题 . 我忘了更新那里引用的文件 .

  • 36

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

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

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

  • 1

    以下内容将任何程序集版本重定向到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),这将不起作用 .

  • 3

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

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

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

  • 3

    我收到此错误消息是由于引用了与我正在构建的程序集同名的程序集 .

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

    为了解决这个问题,我通过右键单击项目并选择“属性”来更改项目名称和组件属性 .

  • 52

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

  • 14

    清理和重建解决方案可能无法替换所有的dll输出目录 .

    我建议尝试将文件夹从“bin”重命名为“oldbin”或“obj”重命名为“oldobj”

    然后尝试再次 Build 你的silution .

    如果你正在使用任何第三方dll,那么你需要在成功构建后复制到新创建的“bin”或“obj”文件夹中 .

    希望这对你有用 .

  • 32

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

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

  • 3

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

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

  • 42

    在我的情况下问题是在椅子和键盘之间:-)

    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库,这不会有问题 . 此外,在我的本地计算机上,NuGet自动更新了web.config:

    <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部分 .

  • 17

    这是解决此问题的方法 .

    • 从异常消息中,获取"problem"库的名称和"expected"版本号 .

    enter image description here

    • 在解决方案中找到.dll的 all copies ,右键单击它们,然后检查它的.dll版本 .

    enter image description here

    好的,所以在这个例子中,我的.dll肯定是2.0.5022.0(所以Exception版本号是错误的) .

    • 搜索解决方案中所有 .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" />
    

    任务完成 !

  • 4

    如果你没有't care about the version and you just want your app to run then right click on the reference and set '特定版本' to false. The other solutions wouldn' t为我工作 .
    enter image description here

  • 4

    我的app.config包含一个

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

    对于npgsql . 不知何故,在用户的机器上,我的app.exe.config丢失了 . 我不确定它是否是一个愚蠢的用户,安装程序故障,还是已经淘汰了防病毒软件 . 替换文件解决了问题 .

  • 4

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

  • 1

    我得到了同样的错误...在我的情况下它解决如下:

    • 首先安装应用程序时,此处的人员在应用程序中使用了Microsoft Enterprise Library 4.1 .

    • 上周我的机器已经格式化了,之后我构建了那个应用程序,然后它给了我一个错误,企业库程序集丢失了 .

    • 然后我安装了Microsoft Enterprise Library 5.0,这是我在Google上作为第一个搜索条目 .

    • 然后,当我构建应用程序时,它给了我上面的错误,即找到的程序集的清单定义与程序集引用不匹配 .

    • 经过大量的搜索工作和分析,我发现应用程序是指4.1.0.0&bin文件夹中的DLL是5.0.0.0版本

    • 我做了什么然后我安装了Microsoft Enterprise Library 4.1 .

    • 删除了以前的引用(5.0)并添加了4.0引用 .

    • 构建应用程序&瞧...它工作了 .

  • 0

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

相关问题