Cannot find unmanaged dll
От: Кэр  
Дата: 20.06.08 01:31
Оценка:
Код, который полагается обложить тестами не запускается в тестовом окружении. Проблема — библиотека которая указана в DllImport атрибуте не может быть найдена во время выполнения теста, если путь указан относительный — только имя директории. Если путь указан абсолютный — то все работает как надо.
Проблема в том, что я пока в размышлениях где искать проблему. Вся соль в том, как грузится тест: есть консольная утилита, которая проставляется кучу environment variables, делает пассы руками, трясет бубен и наконец запускает nunit_gui-console, которая запускает TestFixture. Сам тест в свою очередь запускает код в Cassini сервере (код на самом деле web-service) и затем вызывает его. Если unmanaged dll лежит в корне web-service или в его bin директории и ссылка на эту dll относительная — то interop не может нащупать эту либу.
Я предполагаю, что нужно внимательно посмотреть на нужное свойство нужного AppDomain, чтобы понять, откуда dll пытается быть загруженной. Внимание, вопрос — на какой из AppDomain и какой из его параметров в это матрешке смотреть. Или если дело не в AppDomain какие пути решения еще возможны?
Re: Cannot find unmanaged dll
От: Кэр  
Дата: 20.06.08 02:13
Оценка:
DllImportAttribute.Value Property:

You can provide a full or relative path. If you provide no path, the DLL must be in the current path at run time, unless the DLL is loaded by some other means. Be aware, however, that using a fully qualified path can introduce inaccuracy if the DLL is moved.


Собственно вопрос — как узнать этот current path? Каков механизм загрузки unmanaged библиотек?
Re[2]: Cannot find unmanaged dll
От: Кэр  
Дата: 21.06.08 00:37
Оценка:
Здравствуйте, Кэр, Вы писали:

Кэр>Собственно вопрос — как узнать этот current path? Каков механизм загрузки unmanaged библиотек?


Собственно — может кому пригодится. Current path == Dicrectory.GetCurrentDirectory(). Нужная unmanaged сборка может лежать там. Также туда нужно положить все зависимости. Если этого сделать, то exception по-прежнему будет DllNotFoundException — к этому нужно быть готовым. Зависимости можно определить с помощью тулзы dependency walker — это далеко не Решарпер, но жить можно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.