我在.NET
中有一个程序集,我通过COM
公开并强烈命名。
部署后,此程序集需要出现在GAC
中。但是,我需要在创建其对象之前检查它是否存在。
不幸的是,如果GAC中没有程序集,即使在运行期间将对象创建放在try / catch中也会导致unhandled exception
。
因此,在我继续创建对象之前,如果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 :(得分:1)
不调用LoadLibrary(),这将起作用的可能性非常小,特别是如果程序集实际安装在GAC中的话。查找DLL是COM的工作,它使用注册程序集时编写的注册表项。
您需要修复错误处理,您从#import指令获得的CLSInterOpInterfacePtr智能指针类型将HRESULT错误代码转换为异常。你需要try / catch来捕获_com_error exception。试图捕获std :: exception将无效,_com_error不会从中获取。
这足以诊断注册问题或DLL丢失。您获得的样板_com_error ::错误值是REGDB_E_CLASSNOTREG(0x80040154),如果COM服务器未注册,则“未注册类”,如果CLR无法找到DLL,则更具体。 _com_error :: Description()方法为您提供了一个可以显示或记录的有些合理的消息。神圣的堆栈跟踪是遥不可及的。