DotNetOpenAuth.Asp 无法在 MVC4 应用程序单元测试中加载程序集或其依赖项之一

Posted

技术标签:

【中文标题】DotNetOpenAuth.Asp 无法在 MVC4 应用程序单元测试中加载程序集或其依赖项之一【英文标题】:DotNetOpenAuth.Asp Couldnt Load Assembly or one of its dependencies in MVC4 App Unit Tests 【发布时间】:2012-12-01 13:22:26 【问题描述】:

我的项目中遇到了非常奇怪的错误。我安装了 DotnetOpenAuth.Aspnet 和 Microsoft.AspNet.WebPages.OAuth 库 nuget 包。当我运行项目时没有问题。但是当我为控制器编写测试时,它会抛出如下异常。

测试方法 MvcApplication2.Tests.ControllerTest.should_return_not_empty_content 抛出异常:

    System.IO.FileLoadException: Could not load file or assembly 'DotNetOpenAuth.AspNet, 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)

另一个奇怪的点是如果我在 VS 2010 中设置一个项目作为 MVC3 应用程序并且测试正在通过。没有失败。但是当我在 VS2012 中进行完全相同的设置时,它会触发与上述相同的错误。 当我在 *** 上搜索时,我看到了这个 solution,但它也没有工作。

您可以在以下几行中找到所有项目和示例测试。它只是一个应用程序一个测试项目。非常容易阅读。

我还在这里添加了一个示例代码,用于控制器和失败的测试。

代码预览的pastebin链接是http://pastebin.com/1PCpq3hW

任何帮助将不胜感激。

Vs2010 和 2012 失败和成功 projects

详细的日志结果如下

*** 装配活页夹日志条目 (13.12.2012 @ 22:27:31) *** 操作失败。 绑定结果:hr = 0x80131040。没有可用的描述。 从以下位置加载的程序集管理器:C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll 在可执行文件 C:\Program Files (x86)\JetBrains\ReSharper\v7.0\Bin\JetBrains.ReSharper.TaskRunner.CLR4.exe 下运行 --- 详细的错误日志如下。 === 绑定状态信息 === 日志:用户 = DEVELOPER-PC\DEVELOPER 日志:DisplayName = DotNetOpenAuth.AspNet,版本 = 4.0.0.0,文化 = 中性,PublicKeyToken = 2780ccd10d57b246 (完全指定) 日志:Appbase = file:///D:/Development/Coachius/CoachiusWeb.Tests/bin/Debug 日志:初始 PrivatePath = NULL 日志:动态基础 = NULL 日志:缓存基础 = NULL 日志:AppName = NULL 调用程序集:CoachiusWeb,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null。 === LOG:此绑定在默认加载上下文中开始。 LOG:使用应用程序配置文件:D:\Development\Coachius\CoachiusWeb.Tests\bin\Debug\CoachiusWeb.Tests.dll.config LOG:使用主机配置文件: LOG:使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 中的机器配置文件。 日志:政策后参考:DotNetOpenAuth.AspNet,版本=4.0.0.0,文化=中性,PublicKeyToken=2780ccd10d57b246 日志:GAC 查找不成功。 日志:正在尝试下载新的 URL 文件:///D:/Development/Coachius/CoachiusWeb.Tests/bin/Debug/DotNetOpenAuth.AspNet.DLL。 LOG:程序集下载成功。尝试设置文件:D:\Development\Coachius\CoachiusWeb.Tests\bin\Debug\DotNetOpenAuth.AspNet.dll LOG:进入从源代码运行设置阶段。 日志:程序集名称为:DotNetOpenAuth.AspNet,版本=4.1.0.0,文化=中性,PublicKeyToken=2780ccd10d57b246 警告:比较程序集名称导致不匹配:次要版本 ERR:程序集引用与找到的程序集定义不匹配。 ERR:从源代码运行设置阶段失败,hr = 0x80131040。 ERR:无法完成程序集的设置(hr = 0x80131040)。探测终止。

【问题讨论】:

交叉发布到here 【参考方案1】:

在您的 web.config 文件中查找 bindingRedirects,并确保它们也存在于您的单元测试的 app.config 文件中。

【讨论】:

亲爱的安德鲁,我已经按照你说的做了。但没有奏效。如果您可以检查我提供链接的项目。你会明白我的意思。您还将在这两个文件中看到 bindingredirects 配置。 我还通过添加从融合日志中获得的详细日志结果进行了编辑。【参考方案2】:

您是否将程序集添加到您的测试项目中? 编译时它们应该显示在文件夹中。由于您的测试项目是主机,因此它需要相同的程序集进行测试(取决于设置,但作为一般规则)

如果是这样,那么您可以进一步查看实际的绑定细节。

在此处查看我关于启用融合日志记录的帖子。 How to enable assembly bind failure logging (Fusion) in .NET

启用它,检查文件夹并查找绑定失败 - 你会看到哪个程序集试图加载它(通常)。如果您不这样做 - 启用成功和失败,然后查看所有程序集版本。有时您会看到加载的多个版本有助于追踪问题,或者是意外版本。

【讨论】:

【参考方案3】:

这是由于 VS 2012 中的一个非常讨厌的错误。在测试项目中的 VS 2012 中,app.config 文件中的程序集重定向不起作用。

这解释了为什么它在 VS 2010 中有效,而在 VS 2012 中无效。

这很烦人。

解决方法是添加一个 .testsettings 文件并将其从测试菜单关联到项目。您必须为此转到解决方案文件夹,否则您将不会在菜单中看到它。

请注意,互联网上的很多资源都说强制旧版本工作的运行设置可以解决问题,但不会。它会使您的 VS / 测试过程崩溃。您需要一个 testsettings 文件。

您这样做是使用没有此错误的VS2010 runner。另一方面,它更慢。

我希望微软能尽快解决这个问题,问题不仅在于 OpenAuth,而且实际上每个 DLL 都使用与另一个 DLL 不同的版本。

欢迎来到 2012 年 DLL Hell 版本。

【讨论】:

那么 VS 2912 Update 1 没有解决这个问题? 不,它没有修复。我不知道他们什么时候会包含它。【参考方案4】:

我想我可能已经找到了一个可能的解决方案。

看到这个link

这里的关键信息在第 3 行和第 7 行。基本上,Microsoft.Web.WebPages.OAuth 需要 DotNetOpenAuth.Core 4.0.0.0,但我拥有的 DotNetOpenAuth.Core 是 4.3.0.0 版本。

【讨论】:

【参考方案5】:

我已经解决了

 <configuration>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <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>
          <dependentAssembly>
            <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>

【讨论】:

【参考方案6】:

我将版本更改为 4.1.0.0,它对我有用

 <dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780CCD10D57B246" culture="neutral" />
    <bindingRedirect oldVersion="1.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780CCD10D57B246" culture="neutral" />
    <bindingRedirect oldVersion="1.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
  </dependentAssembly>

【讨论】:

以上是关于DotNetOpenAuth.Asp 无法在 MVC4 应用程序单元测试中加载程序集或其依赖项之一的主要内容,如果未能解决你的问题,请参考以下文章

无法在Bash中使用变量分配另一个变量

Cron 作业指示错误 - mv: cannot access <filename> 但文件已移动

UNIX 命令 mv 和 rm 如何处理打开的文件?

为啥linux无法重命名文件

将 h2 数据库从 h2.db 转换为 mv.db

apt无法重命名文件