У меня есть собрание в .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++?
Или есть более элегантное решение для этого?
Делать не вызовите 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 () предоставляет вам несколько разумных сообщений, которые вы можете отобразить или записать в журнал. Святая трасса стека недоступна.
Других решений пока нет …