使用COM组件时出错

时间:2011-10-20 07:31:49

标签: c# .net visual-studio com

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

现在当我尝试通过从它启动某个类来使用它时,它给了我一个例外 - 检索具有CLSID< 1111-1111的组件的COM类工厂....>由于以下错误而失败:80040154。

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

以上注册问题的解决方案?如果没有,那么如何解决它。

现在我使用regsvr32.dll注册了ABCServer.dll。 但是,

我有代码,

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

}

之前提供错误的第1行现在只是终止了应用程序。 我甚至在调试时在第1行和第2行添加了断点。但控制从未到达第2行,只要在第1行按F10,应用程序就会终止。

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

3 个答案:

答案 0 :(得分:2)

您的Interop.ABCServer.DLL似乎只是runtime callable wrapper。 它只包含marshalls调用真正的 COM库的代码。

所以你需要第二个dll,它是你必须在regsvr32.exe注册的具体COM组件。它可能叫做ABCServer.DLL

附加问题:

如果提供的Interop lib是最新的,您可以使用它。如果没有,您可以使用TLBIMP.EXE创建自己的。当直接向COM dll添加引用时,CS将为您动态生成RCW库。如果你想要使用多个COM库之间没有依赖关系,那就完全没问题了。

答案 1 :(得分:2)

80040154通常是一个错误,因为COM组件尚未注册。您通常使用regsvr32 yourdll.dll注册COM dll,这会将GUID添加到您的注册表中,这样无论何时使用COM对象的GUID,系统都将知道从何处加载DLL。

.NET为COM dll创建了一个包装器,你可以看到这个Interop.*.*,但你需要注册包装器所用的DLL。可能你在某处有一个ABCServer.DLL。

答案 2 :(得分:0)

Interop.ABCServer.dll可能引用了一些其他包含COM代码的DLL。检查装配清单中的哪些是。要注册COM组件,请使用regsvr32。

如果要检查组件是否已注册,请在HKEY_CLASSES_ROOT下的注册表中检查组件是否已良好列出。基于CLSID,您可以在HKEY_CLASSES_ROOT \ CLSID下查找以确定dll的路径。