使用C#/托管代码为免注册COM Interop设置DLL

时间:2014-01-24 10:36:53

标签: c++ .net com interop com-interop

我是COM新手,必须为C ++ dll创建一个COM包装器,以使托管代码可以访问其中的某些功能。我主要跟着this tutorial on code project创建了一个COM ATL dll。我创建了一个后构建步骤,在COM dll上调用tlbimp.exe来创建包装。

添加对tlbimp.exe创建的dll的引用有效,并且我获得了COM dll上的方法的代码完成,并且可以编译使用该dll的托管代码。但是,运行该代码会导致以下异常:

Unhandled Exception: System.Runtime.InteropServices.COMException: Retrieving the COM class factory 
for component with CLSID {FD6F73D2-0208-455A-953A-C911EC2CAEAB} failed due to the following error: 
80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
//...

如果我正确理解了这个例外以及MSDN上的文档,那么下一步就是设置免注册COM互操作的“免注册”部分。我查看了各种指南,例如this onethis one,但我仍然不明白我必须做什么。

所以我的问题是:

在没有注册的情况下,我需要采取哪些基本步骤才能使我新创建的.Net兼容COM dll加载?

我是否必须为使用COM dll的.Net应用编写清单? 我必须为我的COM dll写一个清单吗?或者tblimp.exe从中生成的DLL?

1 个答案:

答案 0 :(得分:2)

我相信您在解决方案资源管理器中看不到Isolated属性,因为您使用tlmbimp.exe手动生成了Interop程序集,然后将其添加到项目中。

不要那样做。删除该现有引用,然后添加一个新引用,您将在其中浏览原始的非托管COM DLL。在Reference Manager中,单击左侧的COM,单击Browse按钮,然后浏览并选择您的非托管COM DLL。 Visual Studio将完成剩下的工作。