1

Tl; dr版本: 我遇到了异常:System.IO.FileLoadException:无法加载文件或程序集'DotNetOpenAuth.AspNet,版本4.0 .0.0 ...

有点沮丧的是 msft 在新的 MVC4 项目模板中使用了如此多的静态类和方法进行身份验证。想要将所有成员资格/身份验证功能包装到一个实现接口的类中,以便我可以模拟单元测试。

经过几个晚上的挣扎,我决定从头开始,所以我删除了所有 DotNetOpenAuth* 程序集引用和 nuget package.config 引用。我同样删除了对 Micrsoft.Aspnet.WebPages.OAuth.dll 的所有引用。

重新安装包:我针对解决方案中需要 dll 引用的三个项目 运行install-package dotnetopenauth.aspnet 。

解决方案不会构建,因为我的包装器有一个包装方法:Microsoft.AspNet.WebPages.OAuth(.dll).OAuthWebSecurity.RegisteredClientData 因此我需要对此组件的引用,所以我运行install-package microsoft.aspnet.webpages .oauth针对相同的三个项目。

解决方案构建,但是当我运行引用 Microsoft.AspNet.WebPages.OAuth(.dll).OAuthWebSecurity.RegisteredClientData 的单元测试时,我得到一个运行时异常: System.IO.FileLoadException :无法加载文件或程序集 'DotNetOpenAuth.AspNet,版本4. 0 .0.0 ...

所有三个项目中对该程序集的引用都引用了 4. 1 .0.0,我的 web.config 中的 DotNetOpenAuth.AspNet assemblyIdentity 也是如此。

我正在使用 resharper 来运行测试,并且测试是 nunit 风格的。

最后,这是我在 fuslogvw 中看到的内容的粘贴。显然有些东西正在寻找 4. 0 .0.0 但我不知道该怎么做(我有几次删除了这个转储中引用的临时数据文件夹):

** * **装配活页夹日志条目(11/13/2012 @ 10:04:54 PM)** * ** * ** * ** *

操作失败。绑定结果:hr = 0x80131040。没有可用的描述。

从以下位置加载的程序集管理器:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 在可执行文件 C:\Program Files (x86)\JetBrains\ReSharper\v7.0\Bin\JetBrains.ReSharper.TaskRunner 下运行.CLR4.MSIL.exe --- 详细的错误日志如下。

=== 预绑定状态信息 === LOG: User = i7\dave LOG: DisplayName = DotNetOpenAuth.AspNet, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246 (完全指定) LOG: Appbase = file: ///C:/SVN/trunk/SoAndSo45/SoAndSo.Com.Tests.Unit/bin/Debug LOG: Initial PrivatePath = NULL LOG: Dynamic Base = NULL LOG: Cache Base = C:\Users\dave\AppData\Local \Temp\kpsvgxtp.io4 日志:AppName = SoAndSo.Com.Tests.Unit

调用程序集:SoAndSo.Com.Tests.Unit,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null。

LOG:此绑定在默认加载上下文中开始。LOG:未找到应用程序配置文件。LOG:使用主机配置文件:LOG:使用来自 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config 的机器配置文件。日志:后策略参考:DotNetOpenAuth.AspNet,版本=4.0.0.0,文化=中性,PublicKeyToken=2780ccd10d57b246 日志:GAC 查找不成功。日志:正在尝试下载新的 URL 文件:///C:/SVN/trunk/SoAndSo45/SoAndSo.Com.Tests.Unit/bin/Debug/DotNetOpenAuth.AspNet.DLL。LOG:程序集下载成功。尝试设置文件:C:\SVN\trunk\SoAndSo45\SoAndSo.Com.Tests.Unit\bin\Debug\DotNetOpenAuth.AspNet.dll LOG:进入下载缓存设置阶段。日志:程序集名称为:DotNetOpenAuth.AspNet,版本=4.1.0.0,文化=中性,PublicKeyToken=2780ccd10d57b246 警告:比较程序集名称导致不匹配: 次要版本 ERR:程序集引用与找到的程序集定义不匹配。ERR:设置失败,hr = 0x80131040。ERR:无法完成程序集的设置(hr = 0x80131040)。探测终止。

谢谢!

4

2 回答 2

5

我认为你应该能够将这些作为 NuGet 包安装到你的单元测试项目中,如果你将这些绑定重定向包含到你的测试项目的 app.config 文件中,它们就可以工作:

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

如果您有一个新的 MVC 项目并在其上运行 NuGet 的Update-Package命令,则会自动创建这些项目。如果您没有运行它,并将 NuGet 包新安装到您的单元测试项目中,那么您的单元测试项目将引用比您的 Web 项目更新的程序集。我认为这会导致您看到的加载失败。您只需确保您的所有程序集在您的解决方案中都具有通用版本,或者确保所需的绑定重定向到位。事实上,我认为无论如何都需要绑定重定向,因为 DotNetOpenAuth 程序集的更新时间比Microsoft.AspNet.WebPages.OAuth包的更新时间要晚。

于 2012-11-16T14:21:24.510 回答
0

从 Msft 的 ASP.NET 团队的 PM 那里得到了一些很好的帮助,他建议我复制/重用 MVC4 项目模板中包含的 DLL 集合,我已经这样做了,它目前正在为我工​​作。

我将 DLL 直接复制到 NuGet 权限之外的“非托管”文件夹中,这样它们就不会无意中得到更新,除非我真的想要它们。

另外值得注意的是,我不得不清除 web.config 中的一些引用和组件转发到 4.1.0.0,因为 MVC4 项目模板包含所有 DotNetOpenAuth 内容的 4.0.*。

于 2012-11-14T21:07:08.247 回答