gpt4 book ai didi

c# - 尝试在 C++ 中加载 COM 包装的 DLL 时出现未处理的异常

转载 作者:行者123 更新时间:2023-11-28 06:02:18 26 4
gpt4 key购买 nike

我在 .NET 中有一个程序集,我通过 COM 公开了它并命名为强。

部署后,此程序集需要出现在 GAC 中。但是,我需要在创建它的对象之前检查它是否存在。

不幸的是,如果程序集不在 GAC 中,即使将对象创建放在 try/catch 中也会在运行时导致未处理的异常

所以在我继续创建对象之前,我必须有一些方法来验证 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 不存在则给出未处理的异常。

那么如何使用C++ 检查DLL 是否安装在GAC 中? 或者是否有更优雅的解决方案?

最佳答案

不要调用 LoadLibrary(),它起作用的可能性非常小,尤其是当程序集实际安装在 GAC 中时。查找 DLL 是 COM 的工作,它使用注册程序集时写入的注册表项。

您需要修复错误处理,您从#import 指令获得的 CLSInterOpInterfacePtr 智能指针类型将 HRESULT 错误代码转换为异常。你需要 try/catch 来捕捉 _com_error exception . try catch std::exception 是行不通的,_com_error 不是从中派生的。

这足以诊断注册问题或缺少 DLL。您获得的样板文件 _com_error::Error 值为 REGDB_E_CLASSNOTREG (0x80040154),如果 COM 服务器未注册,则为“类未注册”,如果 CLR 无法定位 DLL,则更具体。 _com_error::Description() 方法为您提供了一条可以显示或记录的合理消息。神圣的堆栈跟踪是遥不可及的。

关于c# - 尝试在 C++ 中加载 COM 包装的 DLL 时出现未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33013347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com