Невозможно загрузить DLL «SQLite.Interop.dll» из x64 / x86, но она может быть загружена вместе с System.Data.SQLite.dll - PullRequest
0 голосов
/ 30 декабря 2018

Я столкнулся с этой странной проблемой.В моем проекте WCF я ссылался на библиотеку классов, которая использует SQLite для запроса статических данных.Естественно, что библиотека классов использует System.Data.Sqlite + System.Data.SQLite.Core + System.Data.SQLite.EF6 + System.Data.SQLite.Linq от NuGet.Сам проект WCF не выполняет запрос.Он вызывает метод из библиотеки классов, который делает это.

Когда я запускаю его на своем компьютере разработчика, все хорошо.Но после того, как я развернул его в IIS на Windows Server 2012, было выдано исключение Unable to load DLL 'SQLite.Interop.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E).Я выполнил поиск SO и обнаружил, что мне нужно ссылаться как минимум на System.Data.SQLite.Core в моем основном проекте WCF и убедиться, что в нем есть папки x64 и x86 с соответствующим Sqlite.Interop.dll в каждой папке соответственно.Указанные папки генерируются автоматически с использованием ссылки NuGet и помещаются в папку bin .Так что я был счастлив.Развернуто.И произошло то же самое: все хорошо на машине разработчика, и затем не удалось загрузить DLL на сервер.

Я даже пытался ссылаться на все пакеты NuGet в основном проекте WCF, но безрезультатно.Затем мне пришло в голову попробовать вручную скопировать dll из папки x64 в корневую папку моего бина, прямо рядом с wcf.dll и System.Data.SQLite.dll.Теперь сообщение об ошибке изменилось на Unable to load DLL 'SQLite.Interop.dll': Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) вместо не найдено.После предоставления ему всех разрешений, это сработало!

Но это поведение кажется мне странным, потому что на моей машине разработчика и другом тестовом сервере я не могу воспроизвести это.Только на сервере Prod будет выдана эта ошибка.

Есть что-то, что я упустил из виду?Кстати, я попытался превратить свой проект WCF от таргетинга на AnyCPU только на x64.Я попытался использовать Включить 32-разрядный в расширенной настройке IIS AppPool.Ни одна из них не работала, пока все библиотеки DLL не оказались в корневом каталоге.

1 Ответ

0 голосов
/ 30 декабря 2018

Я мог бы быть на что-то здесь.Я сделал procmon.Мне кажется, что dll под x86 была найдена успешно.Однако в операции CreateFile отказано в доступе.enter image description here

Теперь похоже, что он попадает в область разрешений.В тестовой среде и на моей машине разработчика AppPool имеет привилегию Бога, поэтому проблема не может быть воспроизведена.

TL; DR Затем я подробно остановился на разрешении.Я обнаружил, что удостоверение приложения WCF имеет разрешение Чтение только для x86 \ Sqlite.Interop.dll .Я добавил Чтение и выполнение и проблема исчезла.Ваш опыт может варьироваться, и может потребоваться разрешение на x64.

После размышлений: сейчас мне понадобится несколько дней, чтобы наблюдать, но я думаю, что это так.Хотя из procmon написано, что Создать файл не удалось, это не значит, что для этого требуется разрешение на запись.

Дальнейшее тестирование показало, что мои настройки разрешений отключены, поскольку я использовал функцию развертывания Visual Studio для развертывания своего веб-сайта.В процессе он устанавливает корневой каталог моего сайта на Чтение только.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...