c++ - 设置 DLL 以实现与 C#/托管代码的免注册 COM 互操作

标签 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 应用程序编写 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/

相关文章:

c++ - 结构与 vector 作为数据持有者

python - 保持 TCP 套接字连接事件和读/写协调

c# - 如何使用 System.Net.DNS 获取 dns 名称的 mx 记录?

c# - 将程序定义为测试版

c# - NativeMethods 类是在 .NET 中专门处理的吗?

c++ - 是否可以在静态库中编写COM代码,然后将其链接到DLL?

c++ - 如何在不同的功能中使用队列?

c++ - 将三个 QGraphicsRectItems 连接成一个对象

c# - 在 C++ 中注册 .NET COM 事件的处理程序

c# - 防止 Excel 退出