场景 - 我正在编写一个控制台应用程序。需要使用一个名为 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。
答案 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的路径。