Как проверить, может ли DLL загружаться без ошибок

У меня есть собственное приложение на C ++ (никаких модных вещей .Net, только C ++). Однако он использует некоторые дополнительные сборки .Net через dll-файлы оболочки смешанного режима. Эти библиотеки загружаются с задержкой загрузки. Проблема с обертками смешанного режима заключается в том, что им нужно полностью доверять для загрузки. Поэтому, когда приложение пытается использовать dll, если ее нет или если ей не доверяют, все происходит сбой с неприятным сообщением об ошибке.

Но в моем случае, если речь идет о моем основном приложении, оно может жить без этих файлов dll. Поэтому мне нужен способ проверить, могут ли быть загружены эти dll (файлы есть и доверяют). Для этого я попытался поместить фиктивный вызов одной из функций dll в блоке try catch, надеясь поймать исключение, но он все равно вылетает с исключением «модуль не найден».

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

мы также попытались использовать метод LoadLibrary, чтобы сначала загрузить dll и проверить возвращаемое значение. Но эта функция загружает Dll, даже если ей не доверяют, но дает сбой, когда мы пытаемся выполнить вызов метода.

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


person Community    schedule 22.10.2009    source источник
comment
Очевидный ответ, не связанный с .NET, - использовать LoadLibrary, но вы уже пробовали это безуспешно. Таким образом, кажется, что вам нужно больше, чем просто проверить, можно ли загрузить DLL; вы также хотите знать, доверяют ли ему в смысле .NET. Таким образом, вам может повезти больше, если вы добавите тег .NET к своему вопросу.   -  person Éric Malenfant    schedule 22.10.2009
comment
Извините, но вам нужно попытаться загрузить и использовать его, чтобы обнаружить ошибки. Если ваше приложение статически связано с DLL, то загрузчик ОС не будет запускать приложение вообще, если какие-либо статически связанные зависимости не найдены. На этом этапе код приложения не выполняется, поэтому вы не можете перехватить какие-либо ошибки из загрузчика ОС. Если вместо этого DLL загружается через LoadLibrary () во время выполнения, это также проверяет только статически связанные зависимости. Приложение не может безопасно отлавливать ошибки из-за зависимостей отложенной загрузки, которые не работают внутри библиотеки DLL. Сама DLL должна будет обрабатывать их изнутри.   -  person Remy Lebeau    schedule 22.10.2009


Ответы (2)


Если все методы не работают, попробуйте запустить отдельный процесс (например, простое приложение командной строки), который попытается загрузить библиотеку, а затем проанализируйте его код возврата.

Но пробовали ли вы обработку структурированных исключений, то есть __try / __ catch, а не try / catch? См. здесь.

person queen3    schedule 22.10.2009

У меня была идея использовать отдельный процесс, чтобы сначала протестировать dll и посмотреть, не возникнет ли в ней ошибок. Я не хочу использовать это в своем приложении, потому что на самом деле это не было клановым решением. но подход __try, __except работал с вызовами dll с задержкой загрузки. Мне даже не пришлось использовать LoadLibrary. Спасибо.

person Community    schedule 24.10.2009