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

11
我在我的项目中遇到了一个非常奇怪的错误。我安装了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中进行完全相同的设置时,它会触发与上述相同的错误。 当我在stackoverflow上搜索时,我看到了这个解决方案,但它也没有起作用。
您可以在以下行中找到所有项目和示例测试。它只是一个应用程序和一个测试项目。非常易于阅读。
此外,我在这里添加了一个控制器和失败测试的样本代码。
代码预览的pastebin链接为http://pastebin.com/1PCpq3hW 任何帮助都将不胜感激。
Vs2010和2012失败和成功项目 像以下一样的详细日志结果
    ***装配绑定程序日志条目(2012年12月13日@ 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 ---详细的错误日志如下。
===绑定状态信息=== LOG:用户= DEVELOPER-PC \ DEVELOPER LOG:DisplayName = DotNetOpenAuth.AspNet,Version=4.0.0.0,Culture=neutral,PublicKeyToken=2780ccd10d57b246(完全指定) LOG:Appbase = file:///D:/Development/Coachius/CoachiusWeb.Tests/bin/Debug LOG:初始PrivatePath = NULL LOG:Dynamic Base = NULL LOG:Cache Base = NULL LOG: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。 LOG:后策略引用:DotNetOpenAuth.AspNet,Version=4.0.0.0,Culture=neutral,PublicKeyToken=2780ccd10d57b246 LOG:GAC查找失败。 LOG:尝试下载新的URL文件:///D:/Development/Coachius/CoachiusWeb.Tests/bin/Debug/DotNetOpenAuth.AspNet.DLL。 LOG:程序集下载成功。 尝试设置文件:D:\Development\Coachius\CoachiusWeb.Tests\bin\Debug\DotNetOpenAuth.AspNet.dll LOG:进入运行源设置阶段。 LOG:程序集名称为:DotNetOpenAuth.AspNet,Version=4.1.0.0,Culture=neutral,PublicKeyToken=2780ccd10d57b246 WRN:比较程序集名称导致不匹配:次要版本 ERR:装配参考与找到的装配定义不匹配。 ERR:运行源设置阶段失败,hr = 0x80131040。 ERR:无法完成程序集的设置(hr = 0x80131040)。 探测终止。

转贴到这里 - Andrew Arnott
6个回答

10

我已经解决了它,使用了

 <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>

5
我想我可能找到了一个可能的解决方案。
请看这个链接 这里的关键信息在第3行和第7行。基本上,Microsoft.Web.WebPages.OAuth需要DotNetOpenAuth.Core 4.0.0.0,但我拥有的DotNetOpenAuth.Core版本是4.3.0.0。

1

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

这就解释了为什么它在VS 2010中可以工作而在VS 2012中不能。

这相当令人烦恼。

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

请注意,互联网上很多资源都说使用runsettings强制旧版本工作就可以解决问题,但事实并非如此。它会崩溃你的VS/测试进程。你需要一个testsettings文件。

通过这样做,你使用的是VS2010运行器,它没有这个错误。另一方面,它更慢。

我希望微软能尽快修复这个问题,因为这个问题不仅与OpenAuth有关,而且与每个使用不同版本的DLL有关。

欢迎来到2012年的DLL地狱版本。


那么VS 2012更新1没有修复这个问题吗? - Tony_Henrich
没有修复。我不知道他们什么时候会包含它。 - Sidar Ok

0

我把版本改成了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>

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

亲爱的安德鲁, 我已经按照你说的做了,但是没有成功。如果你可以检查一下我给出链接的项目,你就会明白我的意思。你也会看到两个文件中的绑定重定向配置。 - gokhanartuk
我还通过添加从融合日志中获取的详细日志结果进行了编辑。 - gokhanartuk

0
你是否已将程序集添加到测试项目中?编译时,它们应该出现在文件夹中。由于测试项目是主机,因此需要相同的程序集进行测试(根据设置而定,但通常如此)。
如果是这样,那么您可以进一步查看实际绑定详细信息。
请参阅我在此处发布的内容,了解如何启用融合日志记录。 如何在.NET中启用程序集绑定失败日志记录(Fusion) 启用它,检查文件夹并查找绑定失败 - 您将看到正在尝试加载它的程序集(通常情况下)。如果没有,请启用成功和失败,并依次查看所有程序集版本。有时您会看到加载了多个版本,这有助于跟踪问题或意外版本。

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