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

Posted

技术标签:

【中文标题】使用 C#/托管代码为免注册 COM 互操作设置 DLL【英文标题】:Setting up a DLL for registration-free COM Interop with C# / Managed code 【发布时间】:2014-02-15 07:33:57 【问题描述】:

我是 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?

【问题讨论】:

那个教程有点老了。只需在 .NET 项目中添加对 COM DLL 的引用即可。然后确保解决方案资源管理器中添加的引用的“隔离”属性为 ON。 你能告诉我在哪里可以找到 VS2012/3 中的“隔离”属性吗? 此属性在此处不存在:i44.tinypic.com/2luooq8.png 【参考方案1】:

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

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

【讨论】:

谢谢,但 VS2012 不允许我添加非托管 COM dll。在相关答案中,我找到了this link you posted。但这也不起作用,它会导致与 me.exe 相关的构建错误(错误 31)。 @Wilbert,有趣的是,我用 VS2012 做过很多次。 VS添加失败会报什么错误? 我接受了这个答案,但创建了一个new question。我想我做错了什么。

以上是关于使用 C#/托管代码为免注册 COM 互操作设置 DLL的主要内容,如果未能解决你的问题,请参考以下文章

使用 COM 互操作从非托管 C++ 访问 c# 属性

在 C++Builder 中使用 C# .NET DLL?

为免注册 COM 生成清单文件

如何在vb6中注册一个不能用作com互操作的.net DLL?

在 C++ 中使用 COM 互操作对象

COM 互操作:C# COM 类包装器引发异常