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