1

我想知道 dll 的作用,所以我将它添加到 ac# 项目中。当我的代码创建一个包含在 dll 中的类的实例时,我收到以下错误消息:

由于以下错误,检索具有 CLSID {D5BED98C-C4EE-4D41-A624-6CFD9106F31B} 的组件的 COM 类工厂失败:80040154 未注册类(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))。

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

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

编辑:这是我的“代码”:

            this.acfg = new ACFG_Info();

提前致谢!

4

2 回答 2

4

您正在使用 COM 组件。COM 自动完成许多事情,您在这里遇到的问题是它能够在磁盘上查找 DLL,加载它,找到实现您创建的类的代码并创建它的实例。听起来很简单,.NET 确实让它看起来很简单,但事实并非如此。找到正确的DLL 绝非易事。

它很早就爆炸了,它还没有找到DLL。为了定位 DLL,COM 在注册表中查找有关该类的详细信息。它所知道的只是一个数字,一个标识类的唯一数字。简称CLSID。当您使用new运算符创建类的实例时,该数字已编译到您的程序中。错误消息告诉您该数字的样子。它是一个 guid,否则与 System.Guid 类完全相同。

使用 SysInternals 的 ProcMon 实用程序可以很好地查看COM 在注册表中的外观。它记录了一个程序如何使用winapi访问注册表。ProcMon 生成的跟踪中通常包含大量信息,通过在跟踪中搜索您在错误消息中看到的数字来定位有趣的位。您会看到它正在搜索注册表项,但没有找到它。这最终使您的程序在“类未注册”错误代码上爆炸。

“注册”类是一个安装过程,需要在 COM 组件变得可用之前完成一次。提供 COM 服务器的供应商通常会为您提供安装程序,因此会处理好这一点。它往往很简单,运行 Regsvr32.exe 通常就足够了。但这在现代 64 位操作系统上不再那么简单了,你会遇到很多麻烦。就像忘记运行提升的命令提示符一样(使用“以管理员身份运行”)。或者通过使用错误版本的 Regsvr32.exe,您需要 c:\windows\syswow64\regsvr32.exe,该程序的 32 位版本。

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

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

于 2013-06-08T13:33:06.617 回答
0

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

于 2013-06-25T19:55:35.123 回答