场景-我正在编写一个控制台应用程序。需要使用一个名为Interop.ABCServer.DLL的DLL --我是COM的新手,所以真的不知道它在哪里出现,但是我已经通过ILDASM检查了这个DLL,它打开并显示元数据。所以,我想这是一个.NET DLL,而不是COM
现在,当我尝试通过从它启动某些类来使用它时,它给了我一个异常--用CLSID<1111-1111.>检索组件的COM类工厂,由于以下错误失败:80040154。
假设COM组件是一种古老的技术,需要首先注册组件,我们需要以某种方式注册它。如何注册此组件(记住它是.NET dll而不是COM )?
以上登记是否解决了问题?如果没有,那么如何解决它。
现在,我已经使用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。
发布于 2011-10-20 07:39:07
您的Interop.ABCServer.DLL似乎只是运行时可调用包装器。它只包含将调用编组到真正的COM库的代码。
因此,您需要第二个dll,这是您的具体COM组件,您必须注册到regsvr32.exe。它的可能性叫做ABCServer.DLL
在你所附的问题中:
如果提供的Interop是最新的,您可以使用它。如果没有,您可以使用TLBIMP.EXE创建自己的库。当直接向COM添加引用时,CS将动态为您生成RCW库。这是绝对可以的,如果您想要使用的多个COM库之间没有依赖关系。
发布于 2011-10-20 07:39:10
80040154通常是一个错误,因为COM组件还没有注册。通常使用regsvr32 yourdll.dll注册COM dll,这将将GUID添加到注册表中,以便每当使用COM对象的GUID时,系统将知道从何处加载DLL。
.NET为COM创建了一个包装器,这就是您看到的这个Interop.*.*,但是您需要注册包装器所用于的DLL。也许你在某个地方有一个ABCServer.DLL。
发布于 2011-10-20 07:39:20
Interop.ABCServer.dll可能引用了包含COM代码的其他dll。签入程序集清单,它们是哪一个。若要注册COM组件,请使用regsvr32。
如果要检查组件是否已注册,请在HKEY_CLASSES_ROOT下的注册表中确认组件已被很好地列出。根据CLSID,您可以在HKEY_CLASSES_ROOT\CLSID下面查找dll的路径。
https://stackoverflow.com/questions/7832522
复制相似问题