我是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互操作的'registration-free'部分 . 我看了各种指南,如this one和this one,但我仍然不明白我必须做什么 .
所以我的问题是:
在没有注册的情况下,我需要采取哪些基本步骤才能使我新创建的.Net兼容COM dll加载?
我是否必须为使用COM dll的.Net应用程序编写清单?我是否必须为COM dll写一个清单?或者tblimp.exe从中生成的DLL?
1 回答
我相信您在解决方案资源管理器中看不到
Isolated
属性,因为您使用tlmbimp.exe手动生成了Interop程序集,然后将其添加到项目中 .Don 't do that. Remove that existing reference, then add a new one, where you' d浏览原始的非托管COM DLL . 在Reference Manager中,单击左侧的
COM
,单击Browse
按钮,然后浏览并选择您的非托管COM DLL . Visual Studio将完成剩下的工作 .