使用COM组件时出错。

3

场景 - 我正在编写一个控制台应用程序。需要使用一个名为Interop.ABCServer.DLL的特定DLL [我对COM很陌生,所以不知道它在这里的作用,但我已经通过ILDASM检查了这个DLL,它打开并显示元数据。所以,我猜它是一个.NET DLL而不是COM DLL]

现在当我尝试通过初始化其中某个类来使用它时,它会给我抛出一个异常 - 由于以下错误:80040154,无法检索具有CLSID<1111-1111....>的组件的COM类工厂。

问题 - 假设COM组件是一种旧技术,并且需要先注册组件,我们需要以某种方式注册它。如何注册此组件(记住它是.NET dll而不是COM dll)?

上述注册是否解决了问题?如果没有,那么如何解决它。

现在我已经使用regsvr32.dll注册了ABCServer.dll。

但是,我有如下代码:

try
{
    Ilookup LP = New LoopUpClass();
    IServer Svr = LP.LookUpServer(hostname, port);
}
catch(Exception ex)
{

}

之前报错的第一行现在只是终止了应用程序。我甚至在调试时在第一行和第二行添加了断点。但控制从未到达第二行,只要我按下F10键就立即终止应用程序。

基本上,一旦我注册了COM组件,我该如何使用它。我需要在ADD REFERENCE对话框中的COM选项卡中注册它,还是需要重新创建一个INTEROP.ABCServer.DLL文件,或者可以使用我提供的原始INTEROP.ABCServer.DLL文件。


尝试使用try{...}Catch(Exception ex){...},看看是否会触发异常。 - Kangkan
代码已经在try-catch块中,控制流程没有到达catch子句 - 应用程序直接终止。 - EagerToLearn
我之前遇到了这样的问题。我重新从头开始创建了解决方案,然后它就正常工作了。 - Kangkan
3个回答

2
您的 Interop.ABCServer.DLL 似乎只是一个 运行时可调用包装器,它仅包含将调用转发到实际 COM 库的代码。
因此,您需要第二个 DLL,这是您要使用 regsvr32.exe 注册的具体 COM 组件。它可能被称为 ABCServer.DLL
至于您补充的问题:
如果提供的互操作库是最新的,则可以使用它。如果不是,则可以使用 TLBIMP.EXE 创建自己的库。当直接向 COM DLL 添加引用时,CS 将为您即时生成 RCW 库。如果您不需要使用多个 COM 库之间的依赖关系,则完全可以使用该方法。

非常感谢。非常清晰准确。现在我已经使用regsvr32注册了ABCServer.dll。现在ADD REFERENCE对话框的COM选项卡显示了这个ABCServer.DLL,那么我是添加com引用还是使用同一个interop.abcserver.dll作为我的项目引用呢?请参见上面编辑过的问题。 - EagerToLearn
尝试编写 Ilookup LP = New LoopUp(); - Jan
类名实际上是 LookUpClass,我猜如果不是这样的话,编译时会出错 :-) - EagerToLearn
是的先生,Lookup是契约/接口,而Lookupclass则是实现。 - EagerToLearn
我知道,COM有时很奇怪。我无法解释为什么,但是当使用名为“LookUp”的COM类时,我必须编写new LookUp()而不是new LookUpClass() - Jan
显示剩余4条评论

2

80040154通常是由于未注册COM组件引起的错误。您通常使用regsvr32 yourdll.dll注册COM dll,这将向注册表添加GUID,以便在使用COM对象的GUID时,系统将知道从哪里加载DLL。

.NET为COM dll创建一个包装器,这就是您看到的Interop.*.*,但您需要注册包装器所用的DLL。也许您有一个名为ABCServer.DLL的文件。


非常感谢。非常清晰准确。现在我已经使用regsvr32注册了ABCServert.dll。现在我可以将同样的interop.abcserver.dll用作我的项目参考吗?请参见上面编辑过的问题。 - EagerToLearn

0

Interop.ABCServer.dll 可能引用了包含 COM 代码的其他 dll。请在程序集清单中查看它们。要注册 COM 组件,请使用 regsvr32。

如果您想检查组件是否已成功注册,请在注册表中的 HKEY_CLASSES_ROOT 下检查您的组件是否已正确列出。根据 CLSID,您可以在 HKEY_CLASSES_ROOT\CLSID 下查找 dll 的路径。


非常感谢。非常清晰准确。现在我已经使用regsvr32注册了ABCServert.dll。现在我可以将同样的interop.abcserver.dll用作我的项目参考吗?请参见上面编辑过的问题。 - EagerToLearn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接