我是 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 应用程序编写 list ? 我必须为我的 COM dll 编写 list 吗?或者tblimp.exe从中生成的DLL?
最佳答案
我相信您在解决方案资源管理器中看不到 Isolated
属性,因为您使用 tlmbimp.exe 手动生成了 Interop 程序集,然后将其添加到项目中。
不要那样做。删除现有引用,然后添加一个新引用,您可以在其中浏览原始非托管 COM DLL。在引用管理器中,单击左侧的 COM
,单击浏览
按钮,然后浏览并选择您的非托管 COM DLL。 Visual Studio 将完成剩下的工作。
关于c++ - 设置 DLL 以实现与 C#/托管代码的免注册 COM 互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21330437/