Необработанное исключение при попытке загрузить обернутую COM библиотеку в переполнении стека

У меня есть собрание в .NET, который я выставил через COM и строго назван.

После развертывания эта сборка должна присутствовать в GAC, Однако мне нужно проверить, существует ли он, прежде чем создавать свой объект.

К сожалению, даже создание объекта в try / catch приводит к unhandled exception во время выполнения, если сборка отсутствует в GAC.

Поэтому у меня должен быть какой-то способ проверить, действительно ли DLL установлена ​​в GAC, прежде чем я продолжу создавать объект.

HINSTANCE histLib;
histLib = LoadLibrary("CLSInterOpLibrary.dll");
if (histLib == NULL)
return false;
encode();

CoInitialize(NULL);
try
{
CLSInterOpLibrary::CLSInterOpInterfacePtr p(__uuidof(CLSInterOpLibrary::CLSInterOpClass));
if (p == nullptr)
return false;
com_ptr = p;
}
catch (exception &e)
{

}

LoadLibrary дает NULL, независимо от того, присутствует ли библиотека в GAC или нет, вероятно, нужен какой-то путь …, и

CLSInterOpLibrary::CLSInterOpInterfacePtr p(__uuidof(CLSInterOpLibrary::CLSInterOpClass));

..дает необработанное исключение, если DLL отсутствует.

Так как бы проверить, еслиDLL установлен вGAC сC++? Или есть более элегантное решение для этого?

0

Решение

Делать не вызовите LoadLibrary (), вероятность того, что это будет работать, очень мала, особенно если сборка фактически установлена ​​в GAC. Поиск DLL — это работа COM, она использует ключи реестра, которые были написаны при регистрации сборки.

Вам нужно исправить свою обработку ошибок, тип интеллектуального указателя CLSInterOpInterfacePtr, полученный из директивы #import, превращает коды ошибок HRESULT в исключения. Вам нужно попробовать / поймать, чтобы поймать исключение _com_error. Попытка поймать std :: exception не сработает, _com_error не выводится из него.

Что достаточно для диагностики проблемы с регистрацией или отсутствующей DLL. Образец шаблона _com_error :: Error, который вы получаете: REGDB_E_CLASSNOTREG (0x80040154), «Класс не зарегистрирован», если COM-сервер не был зарегистрирован, что-то более конкретное, если CLR испытывает проблемы с поиском DLL. Метод _com_error :: Description () предоставляет вам несколько разумных сообщений, которые вы можете отобразить или записать в журнал. Святая трасса стека недоступна.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]