2009-10-19 6 views
0

У меня возникла ситуация, когда я использую стороннюю библиотеку. На машинах, где библиотека не установлена, я получаю исключение: Unable to load DLL '*.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E). Тем не менее, я обертываю вызывающий код в блок try-catch.DLL не найдена ошибка

Я попытался поймать как исключение, так и исключение DllNotFoundException, и на самом деле не поймать ошибку. Затем приложение закрывается несравненно.

Я бы хотел, чтобы приложение обнаружило ошибку, а затем продолжайте работу без использования сторонних функций.

Как я могу либо предотвратить ошибку с проверкой dll (не зная пути), либо изящно поймать ошибку.

Редактировать: Подробнее Это стороннее приложение, которое позволяет мне использовать USB-устройство. Они предоставили обертку .net для своих неуправляемых api (я думаю). Я добавила управляемые DLL в проект обычным способом.

Редактировать: Мне удалось найти путь для рассматриваемой DLL. Я делаю File.Exisits в dll и не вхожу в блок кода, если dll не существует. Кажется, это работает до сих пор. Спасибо за помощь!

ответ

4

Исключение выбрасывается в JITTER, а не в вашем коде (то есть в другом потоке). Это означает, что вы намазаны маслом.

2

JITter, бросающий исключение, делает это немного сложнее.

Вы можете проверить DLL, но вы должны иметь в виду , когда JITTER собирается искать DLL для загрузки.

Вы ДОЛЖНЫ проверить DLL, прежде чем загружать любые типы, зависящие от этой DLL. Загрузка типов происходит всякий раз, когда вы нажимаете метод, который вызывает любые типы, требующие такого типа. (Вау!). Поэтому в основном вам нужно убедиться, что вы не вызываете какие-либо методы, которые содержатся в типах, вызывающих методы, требующие вашей сторонней библиотеки.

Что я сделал для saftey: оберните любые ссылки на DLL в тип, к которому никогда не обращались или не ссылались напрямую - допустим, это WrapperClass. Проверьте наличие DLL, затем (если он существует), используйте Activator.CreateInstance(...), чтобы создать экземпляр WrapperClass.

Обратите внимание, что это работает для меня до .net 3.5. Насколько я знаю, нет гарантии, что это не будет нарушено в будущих версиях или даже исправлениями.

2

Вы не говорите, как импортируете эту стороннюю библиотеку? Вы добавили его в свой проект и позволили VS создать обертку для вас автоматически?

Или вы используете DllImport:

[DllImport("thirdParty.dll")] 
static extern int thirdPartyFunction(some params); 

В любом случае оба этих метода не собираются, чтобы показать вам много любви, если thirdParty.dll не установлен на компьютере.

Вам необходимо сделать то, что называется LateBinding, ознакомиться с этой статьей CodeProject о том, как это сделать Late binding on native DLLs with C#

Смежные вопросы