C# 使用COM组件时出错

C# 使用COM组件时出错,c#,.net,visual-studio,com,C#,.net,Visual Studio,Com,场景-我正在编写一个控制台应用程序。需要使用一个名为Interop.ABCServer.DLL的特定DLL[我对COM不熟悉,所以真的不知道它在这里的图片中出现的位置,但我通过ILDASM检查了这个DLL,它打开并显示元数据。所以,我猜它是一个.NET DLL,而不是COM DLL] 现在,当我尝试通过从中启动某些类来使用它时,它会给我一个异常-检索具有CLSID的组件的COM类工厂失败,原因是以下错误:80040154 问题-假设COM组件是一种旧技术,需要先注册组件,我们需要以某种方式注册它

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

现在,当我尝试通过从中启动某些类来使用它时,它会给我一个异常-检索具有CLSID的组件的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,我该如何使用它。我是否需要从“添加引用”对话框的COM选项卡注册它,或者我需要重新创建INTEROP.ABCServer.DLL,或者我可以使用提供的原始INTEROP.ABCServer.DLL。

您的
INTEROP.ABCServer.DLL
似乎正是最合适的。 它只包含封送调用真实COM库的代码

因此,您需要第二个dll,它是您的具体COM组件,您必须向
regsvr32.exe
注册。它可能被称为
ABCServer.DLL

关于你所附的问题:


如果提供的互操作库是最新的,则可以使用它。如果没有,您可以使用TLBIMP.EXE创建自己的。当直接向COM dll添加引用时,CS将为您动态生成RCW库。如果您想要使用的多个COM库之间没有依赖关系,那么这是绝对可以的。

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


.NET为COM DLL创建了一个包装,这就是您看到的
Interop.*.
,但是您需要注册包装所针对的DLL。您可能在某个地方有一个ABCServer.DLL。

Interop.ABCServer.DLL可能引用了其他包含COM代码的DLL。在程序集清单中签入它们是什么。要注册COM组件,请使用regsvr32


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

非常感谢。非常清晰准确。现在我已经使用regsvr32注册了ABCServert.dll。现在我可以使用相同的interop.abcserver.dll作为项目的参考吗?请看上面编辑的问题。非常感谢。非常清晰准确。现在我已经使用regsvr32注册了ABCServert.dll。现在,添加引用对话框的COM选项卡显示了这个ABCServer.DLL,那么我是添加COM引用还是使用相同的interop.ABCServer.DLL作为项目的引用?请参阅上面编辑的问题。尝试编写
Ilookup LP=New LoopUp()类名实际上是LookUpClass,我想它会给我一个编译时错误:-)RCW库应该同时包含
LookUpClass
LookUp
类型。是的,先生,LookUp是契约/接口,LookUpClass是实现。非常感谢。非常清晰准确。现在我已经使用regsvr32注册了ABCServert.dll。现在我可以使用相同的interop.abcserver.dll作为项目的参考吗?请查看上面编辑的问题。放置try{..}Catch(异常ex{…})并查看是否得到异常。它已经在try-Catch中,控件也没有到达Catch子句-应用程序刚刚终止。我之前遇到过这样的问题。我又一次从头开始创建了解决方案,然后效果很好。