访问在Iesi.Collections.dll上被拒绝

时间:2013-09-09 20:53:08

标签: c# nhibernate dll fileloadexception

对于我的团队最近开始的项目,当我尝试运行新创建的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. 检查DLL所在的packages目录中的文件夹权限
  2. 确保将Iesi.Collections DLL复制到build \ Debug on build
  3. 检查NHibernate设置是否合理(它们与适合我的项目的设置相匹配)
  4. 从TFS重新获得该项目;因为我是唯一一个发生这种情况的人,我认为它可能只是一个损坏的Get的情况。这没有效果。 (重新获得,我的意思是我关闭VS2012,删除现有文件夹,打开一个新的VS2012实例,获取>高级>获取特定版本,同时选中两个复选标记。)
  5. 手动将packages目录中的DLL重新关联到C#项目。没效果。
  6. 因为DLL有一个公钥令牌,所以我知道DLL已签名 - 所以不是这样。
  7. 可以排除上面的代码,因为这个确切的行已经在另外两个项目中用于设置本地数据库模式以进行单元测试。
  8. 通过查看属性检查Windows是否阻止了DLL;它没有被封锁。
  9. 在融合日志中,我注意到它正在尝试从Web项目下载DLL,因此我也将Iesi.Collections.dll添加到Web项目中;没有效果。
  10. 尽管我的SpecFlow版本是1.9.2,但我注意到Castle.CoreNHibernate.ByteCode.Castlelog4net丢失了,所以我将这些添加到正在进行数据访问的项目中(C :\项目\ SomeProject \ SomeProject.Core);没有效果。 (之所以添加,是因为那些我可以运行特征测试的项目,这意味着它只是这个特定的解决方案。)
  11. 由于其他项目的其他一些条件,我默认以管理员身份运行VS2012;既然我很绝望,我试着禁用它并像我一样运行,没有任何效果。
  12. 一些额外的StackOverflow研究表明,另一个用户通过清除他们的临时Internet文件来征服类似的问题,所以我启动了CCleaner - 没有效果。
  13. 更多StackOverflow研究揭示了一个人可以从命令行用一个卑微的iisreset解决他的问题的故事;我试过这个,没有效果。
  14. 问题:是什么原因导致Iesi.Collections.dll在NHibernate初始化时抛出Access Denied FileLoadException?

2 个答案:

答案 0 :(得分:2)

您是否从Internet获取此DLL文件?如果是,则必须确保Windows不阻止DLL。要检查此项,请转到Windows资源管理器中的文件属性,并验证是否有标记为“取消阻止”的按钮。如果是,您的文件被阻止,您必须单击此按钮才能取消阻止二进制文件。

答案 1 :(得分:2)

在ReSharper中,默认情况下有一个设置处于正在测试的Shadow-copy程序集中。通过去Resharper |找到它选项......,工具|单元测试。

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

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