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

时间:2013-06-08 12:25:18

标签: c# dll visual-studio-2012

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

  

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

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

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

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

            this.acfg = new ACFG_Info();

提前致谢!

2 个答案:

答案 0 :(得分: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命令行选项运行它来注册。或者它被设计为仅通过在客户端程序中使用清单来正确操作。 Etcetera,这可能会匆忙变得复杂。

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

答案 1 :(得分:0)

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