0

对于我的团队最近开始的一个项目,当我尝试运行我新创建的 SpecFlow 单元测试时,我遇到了以下异常:

Could not load file or assembly 'Iesi.Collections, Version=1.0.1.0, Culture=neutral,
PublicKeyToken=aa95f207798dfdb4' or one of its dependencies. Access is denied.

Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4

...它失败的 C# 片段如下所示:

private static ISessionFactory _sessionFactory;

// ... Further down in the class ...
public static void GenerateSchema()
{
    _sessionFactory = Fluently.Configure(new Configuration().Configure())
                      .Mappings(m => m.FluentMappings.AddFromAssembly(typeof(DataContext).Assembly))
                      .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true))
                      .BuildConfiguration()
                      .BuildSessionFactory();
}

...融合日志如下所示:

=== Pre-bind state information ===
LOG: User = Unknown
LOG: DisplayName = Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4
(Fully-specified)
LOG: Appbase = file:///C:/Projects/SomeProject/SomeProject.FeatureTest/bin/Debug
LOG: Initial PrivatePath = NULL
Calling assembly : NHibernate, Version=3.3.1.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Projects\SomeProject\FeatureTest\bin\Debug\SomeProject.FeatureTest.dll.config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Iesi.Collections, Version=1.0.1.0, Culture=neutral, PublicKeyToken=aa95f207798dfdb4
LOG: Attempting download of new URL file:///C:/Projects/SomeProject/SomeProject.Web/bin/Debug/Iesi.Collections.DLL.
ERR: Failed to complete setup of assembly (hr = 0x80070005). Probing terminated.

我(和我的团队)对此感到困惑,因为我们尝试了以下事情:

  1. 检查packagesDLL 所在目录的文件夹权限
  2. 确保在构建时将 Iesi.Collections DLL 复制到 bin\Debug
  3. 检查 NHibernate 设置是否正常(它们与适合我的项目的设置相匹配)
  4. 从TFS重新收购项目;因为我是唯一发生这种情况的人,所以我认为这可能只是 Get 损坏的情况。这没有效果。(重新获取,我的意思是我关闭了 VS2012,删除了现有文件夹,打开了一个新的 VS2012 实例,获取 > 高级 > 获取特定版本,并选中了两个复选标记。)
  5. 手动将 DLL 从目录重新关联packages到 C# 项目。没有效果。
  6. 因为 DLL 有一个公钥令牌,所以我知道 DLL 是经过签名的——所以也不是这样。
  7. 可以排除上面的代码,因为这行代码已经在另外两个项目中用于设置本地 DB 模式以进行单元测试。
  8. 通过查看属性检查 DLL 是否被 Windows 阻止;它没有被阻止。
  9. 在融合日志中,我注意到它正在尝试从 Web 项目中下载 DLL,因此我也将 Iesi.Collections.dll 添加到了 Web 项目中;没有效果。
  10. 尽管我的 SpecFlow 版本是 1.9.2,但我注意到Castle.CoreNHibernate.ByteCode.Castlelog4net丢失了,所以我将它们添加到正在进行数据访问的项目中 (C:\Projects\SomeProject\SomeProject.Core); 没有效果。(添加是因为它们在另一个项目中,我可以在其上运行功能测试,这意味着它只是这个特定的解决方案。)
  11. 由于其他项目的一些其他情况,我默认以管理员身份运行VS2012;现在我很绝望,我尝试禁用它并以自己的身份运行,但没有效果。
  12. 一些额外的 StackOverflow 研究表明,另一个用户通过清除他们的 Temporary Internet Files 解决了类似的问题,所以我启动了 CCleaner - 没有效果。
  13. 更多 StackOverflow 研究揭示了一个人可以iisreset通过命令行简单地解决问题的故事;我试过这个,没有效果。

问题:是什么导致 Iesi.Collections.dll 在 NHibernate 初始化时抛出 Access Denied FileLoadException?

4

2 回答 2

2

你是从 Internet 上得到这个 DLL 文件的吗?如果是,则必须确保 DLL 未被 Windows 阻止。为了检查这一点,请转到 Windows 资源管理器中的文件属性并验证是否有一个标有“取消阻止”的按钮。如果是,您的文件已被阻止,您必须单击此按钮才能解除对二进制文件的阻止。

于 2013-09-09T22:05:25.810 回答
2

在 ReSharper 中,有一个默认设置为正在测试的卷影复制程序集。它是通过去 Resharper | 找到的。选项..., 工具 | 单元测试。

禁用此选项可防止程序集被卷影复制到 DLL 显然缺乏运行权限的位置,从而解决问题。

tl;dr -检查您的 ReSharper 设置!

于 2013-09-10T14:05:15.723 回答