调用.dll的构造函数会抛出COMException

本文关键字:COMException 构造函数 dll 调用 | 更新日期: 2023-09-27 18:17:44

我想知道dll是做什么的,所以我把它添加到c#项目中。当我的代码创建一个从dll中包含的类的实例时,我得到这个错误消息:

为CLSID {d5bed98c - c4e - 4d41 - a624 - 6cfd9106f31b}的组件检索COM类工厂失败,原因是以下错误:80040154类未注册(异常来自HRESULT: 0x80040154 (regdbe_classnotreg)))。

我已经将平台目标更改为x86

我也试图注册dll,但它似乎没有入口点。我错过了什么,dll内容是不可执行的?

编辑:下面是我的"代码":

            this.acfg = new ACFG_Info();

提前感谢!

调用.dll的构造函数会抛出COMException

您正在使用COM组件。COM自动做很多事情,你在这里遇到的问题是它能够在磁盘上找到一个DLL,加载它,找到实现你创建的类的代码,并创建它的实例。听起来很简单,. net当然使它看起来很简单,但事实并非如此。查找正确的 DLL从来不是简单的。

它很早就爆炸了,它还没有找到DLL。为了定位DLL, COM在注册表中查找有关该类的详细信息。它所知道的只是一个数字,一个唯一的标识类的数字。简称CLSID。当您使用new操作符创建类的实例时,该数字被编译到程序中。错误消息告诉您该数字是什么样子的。它是一个向导,否则就和系统是同一种动物。类Guid。

查看 COM如何查看注册表的一个很好的方法是使用SysInternals的ProcMon实用程序。它记录了程序如何使用winapi访问注册表。在ProcMon生成的跟踪中通常有大量的信息,通过在跟踪中搜索您在错误消息中看到的数字来定位有趣的部分。您将看到它搜索注册表项,但没有找到它。这最终使你的程序在"类未注册"错误代码上爆炸。

"注册"类是一个安装过程,需要在COM组件可用之前完成一次。提供COM服务器的供应商通常会为您提供安装程序,因此这是需要注意的。如果趋向于简单,运行Regsvr32.exe通常就足够了。但这在现代64位操作系统上就不那么简单了,你会在很多方面遇到麻烦。比如忘记运行提升的命令提示符(使用"以管理员身份运行")。或者使用错误版本的Regsvr32.exe,您需要c:'windows'syswow64' Regsvr32.exe, 32位版本的程序。

或者安装过程更复杂,COM dll可能有依赖dll,需要首先安装这些dll才能正常工作。或者它实际上是一个进程外服务器,需要通过使用/regserver命令行选项运行它来注册一个exe。或者它被设计为只有在客户端程序中使用清单才能正确操作。等等,这很快就会变得复杂。

如果这些故障排除提示不能帮助您,那么您需要供应商的帮助。他们会确切地知道需要什么,我们只能在这里猜测。

我建议使用SpyStudio来查看COM创建的流程。