HRESULT: 0x80131040:所定位的程序集清单定义与程序集引用不匹配。

82
在运行 nunit 通过 ncover 时,出现了“所定位程序集的清单定义与程序集引用不匹配”的错误。有什么想法吗?

5
您可能希望重新构建标题和问题,以吸引更多的关注。例如:“我正试图做 X,但出现了这个错误:{错误描述}……等等”。请注意,我的翻译保持原文意思不变,同时尽可能使其通俗易懂。 - Mostlyharmless
21
没问题,我可以通过错误代码找到这个问题。 - Leandro Bardelli
一个老问题,但很常见。对我来说,原因是由于某种原因我有两个实例的Visual Studio运行相同的解决方案。另一个在任务栏上不可见,但只在任务管理器中可见。关闭两个实例,然后进行清理和重建即可解决问题。 - Sami
22个回答

63

这是一个装配件不匹配的问题:从一个程序集引用的 DLL 没有符合预期的方法签名。

清理解决方案,重新构建所有内容,再试一次。

另外,请注意:如果这是对全局程序集缓存 (GAC) 中某个东西的引用,则可能会出现某些东西指向了错误的版本。通过每个引用的属性确保选择了正确的版本或将 Specific Version 设置为 false。


19
有没有一种方法可以强制编译器在编译时检查这种情况?我敢打赌,在VS2005中这是默认设置。 - Maslow

13

我最近遇到了这个问题,然后我在问题的dll上运行了'depends.exe'。它告诉我该dll是在x86下编译的,而一些依赖项却是在x64下编译的。

如果您仍然有疑问,我建议使用depends.exe。


5
还有一个名为Depends.Net的工具,网址为http://www.netomatix.com/development/DependsNet.aspx。我的问题很普通,module1想要加载的是module2版本5.0.0.0,但实际上module2的版本是5.0.8.3760。Depends工具没有发现这个问题,但Depends.Net却发现了。 - RenniePet
2
链接到DependNet已经失效,https://github.com/isindicic/DependencyWalker.Net/releases 我反编译了exe并检查了源代码,没有问题,并且具有良好的用户界面。 - OzBob

10

在我的情况下,针对一个WCF REST服务项目,我需要在web.config中添加一个运行时部分,其中包含所请求的dll:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
      </dependentAssembly>
.
.
.
  <runtime>

挽救了我的一天,谢谢,删除运行时程序集对我有用。 - Osama Gadour

8

只需删除bin文件夹,然后重新创建项目,所有内容都会再次生成,现在应该可以正常运行了。


1
我花了接近两个小时来解决这个问题。删除 bin 目录对我起了作用。 - Brad
最好的解决方案 - Vinicius Sin

7

通过删除所有的运行时部分,我的问题得到了解决。

<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35"/>
                <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35"/>
                <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>

这对我有用。在使用automapper时遇到了问题。异常:无法加载文件或程序集“AutoMapper,Version = 4.2.1.0,Culture = neutral,PublicKeyToken = be96cd2c38ef1005”或其某个依赖项。所定位的程序集清单定义与程序集引用不匹配。(来自HRESULT的异常:0x80131040) - ziaprog

6
通常情况下,当测试环境中的 DLL 中的某个版本与开发环境不匹配时,就会出现这种情况。
请清理并构建您的解决方案,并将所有的 DLL 文件带到出现错误的环境中,这样应该就可以解决问题了。

5
在调试时,我遇到了这个消息:
"Error while calling service <ServiceName> Could not load file or assembly 'RestSharp, 
Version=105.2.3.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. 
The located assembly's manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)"
原因

在我的项目中,有两个内部组件都使用了RestSharp,但这两个组件分别使用不同版本的RestSharp(一个使用版本号为105.2.3.0的,另一个使用版本号为106.2.1.0的)。

解决方案

要么将其中一个组件升级到较新的版本,要么将另一个组件降级。在我的情况下,更安全的做法是将版本号从106.2.1.0降级到105.2.3.0,然后在NuGet包管理器中更新组件,这样两个组件就有了相同的版本。

重新构建后,问题得到了解决。


5

在通过共享文件夹从不同的计算机访问项目文件时,我遇到了类似的问题。在我的情况下,清除并重新构建没有起到帮助作用。必须从输出目录中删除bin和objects文件夹。


3
在我的特定情况下,我在VBScript中执行CreateObject时得到了这个结果。在我的情况下,原因是程序集的版本存储在GAC中,而该版本比我编译的版本旧。(为了解决早期的问题,我将程序集安装在了GAC中)。
因此,如果您正在使用COM可见类,请确保在使用RegASM注册新程序集之前从GAC中删除旧版本的程序集。

3

在我的情况下,这是因为WebGrease的原因。我使用NuGet更新了它到最新版本,但与依赖项发生了冲突。我手动添加了以下代码到web.config中,并且它完美地工作了。

<dependentAssembly>
    <assemblyIdentity name="WebGrease" culture="neutral" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
</dependentAssembly>

请注意,我的解决方案仅适用于与WebGrease相关的错误。错误代码将保持不变。此外,您需要相应地更改oldVersion和newVersion中的版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接