Доступ запрещен на Iesi.Collections.dll
Для проекта, который моя команда недавно начала, я получаю следующее исключение, когда пытаюсь запустить свои недавно созданные модульные тесты 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 - Убедитесь, что DLL-библиотека Iesi.Collections копируется в bin\Debug при сборке
- Убедитесь, что настройки NHibernate нормальны (они совпадают с настройками проекта, который у меня работает)
- Повторно приобрел проект у TFS; так как я единственный человек, с которым это происходит, я подумал, что это может быть просто случай испорченного Get. Это не имело никакого эффекта. (Повторно приобретите, я имею в виду, что я закрыл VS2012, удалил существующую папку, открыл новый экземпляр VS2012, Get > Advanced > Get Specific Version, отметив обе галочки.)
- Повторное связывание DLL из
packages
каталог для проекта C#. Нет эффекта. - Поскольку у DLL есть токен открытого ключа, я знаю, что DLL подписана, так что это не так.
- Вышеприведенный код можно исключить, поскольку эта точная строка использовалась в двух других проектах для настройки локальных схем БД для целей модульного тестирования.
- Проверено, что DLL не заблокирована Windows, просмотрев Свойства; это не заблокировано.
- В журнале Fusion я заметил, что он пытается загрузить DLL из веб-проекта, поэтому я также добавил Iesi.Collections.dll в веб-проект; нет эффекта.
- Несмотря на то, что моя версия SpecFlow 1.9.2, я заметил, что
Castle.Core
,NHibernate.ByteCode.Castle
, а такжеlog4net
отсутствовали, поэтому я добавил их в проект, который осуществляет доступ к данным (C:\Projects\SomeProject\SomeProject.Core); нет эффекта. (Добавлено потому, что они находятся в другом проекте, на котором я могу запустить функциональные тесты, что означает, что это просто именно это решение.) - Из-за некоторых других условий в других проектах я по умолчанию запускаю VS2012 в качестве администратора; теперь, когда я в отчаянии, я попытался отключить это и бежать как я, безрезультатно.
- Некоторые дополнительные исследования Stackru показали, что другой пользователь преодолел аналогичную проблему, очистив свои временные файлы Интернета, поэтому я загрузил CCleaner - безрезультатно.
- Более детальное исследование Stackru раскрыло историю о парне, который мог смиренно решить свои проблемы
iisreset
из командной строки; Я попробовал это, безрезультатно.
Вопрос: Что заставляет Iesi.Collections.dll генерировать исключение AccessLied FileLoadException при инициализации NHibernate?
2 ответа
В ReSharper есть настройка, которая по умолчанию включена для тестируемых сборок теневого копирования. Это найдено, перейдя в Resharper | Опции..., Инструменты | Модульное тестирование.
Отключение этого параметра предотвращает теневое копирование сборок в место, из которого DLL, очевидно, не имеет разрешений для запуска, что решает проблему.
tl; dr - Проверьте настройки ReSharper!
Вы получили этот файл DLL из Интернета? Если да, вы должны убедиться, что DLL не заблокирована Windows. Чтобы проверить это, перейдите к свойствам файла в проводнике Windows и убедитесь, что есть кнопка с надписью "Разблокировать". Если да, ваш файл заблокирован, вы должны нажать на эту кнопку, чтобы разблокировать двоичный файл.