Доступ запрещен на 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.

Я (и моя команда) поставлены в тупик, потому что мы попробовали следующее:

  1. Проверьте права доступа к папке на packages каталог, в котором находится DLL
  2. Убедитесь, что DLL-библиотека Iesi.Collections копируется в bin\Debug при сборке
  3. Убедитесь, что настройки NHibernate нормальны (они совпадают с настройками проекта, который у меня работает)
  4. Повторно приобрел проект у TFS; так как я единственный человек, с которым это происходит, я подумал, что это может быть просто случай испорченного Get. Это не имело никакого эффекта. (Повторно приобретите, я имею в виду, что я закрыл VS2012, удалил существующую папку, открыл новый экземпляр VS2012, Get > Advanced > Get Specific Version, отметив обе галочки.)
  5. Повторное связывание DLL из packages каталог для проекта C#. Нет эффекта.
  6. Поскольку у DLL есть токен открытого ключа, я знаю, что DLL подписана, так что это не так.
  7. Вышеприведенный код можно исключить, поскольку эта точная строка использовалась в двух других проектах для настройки локальных схем БД для целей модульного тестирования.
  8. Проверено, что DLL не заблокирована Windows, просмотрев Свойства; это не заблокировано.
  9. В журнале Fusion я заметил, что он пытается загрузить DLL из веб-проекта, поэтому я также добавил Iesi.Collections.dll в веб-проект; нет эффекта.
  10. Несмотря на то, что моя версия SpecFlow 1.9.2, я заметил, что Castle.Core, NHibernate.ByteCode.Castle, а также log4net отсутствовали, поэтому я добавил их в проект, который осуществляет доступ к данным (C:\Projects\SomeProject\SomeProject.Core); нет эффекта. (Добавлено потому, что они находятся в другом проекте, на котором я могу запустить функциональные тесты, что означает, что это просто именно это решение.)
  11. Из-за некоторых других условий в других проектах я по умолчанию запускаю VS2012 в качестве администратора; теперь, когда я в отчаянии, я попытался отключить это и бежать как я, безрезультатно.
  12. Некоторые дополнительные исследования Stackru показали, что другой пользователь преодолел аналогичную проблему, очистив свои временные файлы Интернета, поэтому я загрузил CCleaner - безрезультатно.
  13. Более детальное исследование Stackru раскрыло историю о парне, который мог смиренно решить свои проблемы iisreset из командной строки; Я попробовал это, безрезультатно.

Вопрос: Что заставляет Iesi.Collections.dll генерировать исключение AccessLied FileLoadException при инициализации NHibernate?

2 ответа

Решение

В ReSharper есть настройка, которая по умолчанию включена для тестируемых сборок теневого копирования. Это найдено, перейдя в Resharper | Опции..., Инструменты | Модульное тестирование.

Отключение этого параметра предотвращает теневое копирование сборок в место, из которого DLL, очевидно, не имеет разрешений для запуска, что решает проблему.

tl; dr - Проверьте настройки ReSharper!

Вы получили этот файл DLL из Интернета? Если да, вы должны убедиться, что DLL не заблокирована Windows. Чтобы проверить это, перейдите к свойствам файла в проводнике Windows и убедитесь, что есть кнопка с надписью "Разблокировать". Если да, ваш файл заблокирован, вы должны нажать на эту кнопку, чтобы разблокировать двоичный файл.

Другие вопросы по тегам