我是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 one和this one,但我仍然不明白我必须做什么。
所以我的问题是:
在没有注册的情况下,我需要采取哪些基本步骤才能使我新创建的.Net兼容COM dll加载?
我是否必须为使用COM dll的.Net应用编写清单? 我必须为我的COM dll写一个清单吗?或者tblimp.exe从中生成的DLL?
答案 0 :(得分:2)
我相信您在解决方案资源管理器中看不到Isolated
属性,因为您使用tlmbimp.exe手动生成了Interop程序集,然后将其添加到项目中。
不要那样做。删除该现有引用,然后添加一个新引用,您将在其中浏览原始的非托管COM DLL。在Reference Manager中,单击左侧的COM
,单击Browse
按钮,然后浏览并选择您的非托管COM DLL。 Visual Studio将完成剩下的工作。