在 .NET 中创建 C++ ATL COM 嵌套命名空间,如 System 命名空间

Posted

技术标签:

【中文标题】在 .NET 中创建 C++ ATL COM 嵌套命名空间,如 System 命名空间【英文标题】:Create C++ ATL COM nested namespaces like System namespace in .NET 【发布时间】:2012-10-30 06:56:45 【问题描述】:

我有几个 ATL COM 服务,并希望每个服务都有自己的命名空间,但位于一个基本命名空间下,就像 .NET 中的系统命名空间一样。

例如,如果 C# 项目要包含这些 COM 对象,则所有对象都将位于同一基本命名空间下:

using MyCompanyName.Terminator;
using MyCompanyName.Superman;
using MyCompanyName.Thor;

...相反,我目前拥有的是:

using Terminator;
using Superman;
using Thor;

...这是我不想要的。我希望能够在该基础下拥有一个基本命名空间和子命名空间。我不知道在创建 ATL 服务时如何执行此操作以及我需要修改什么来执行此操作。是我在 IDL 文件中修改的吗?

【问题讨论】:

不,COM 自动化不支持这个。 @Hans 感谢您澄清这一点。 【参考方案1】:

如果您以托管客户端为目标,则可以为它们提供命名空间!但是,由于 COM 与语言无关,因此您无法使用接口描述(类型库)提供命名空间。但是,无论何时创建托管包装程序集(实际上由客户端引用),它们都可以具有命名空间来寻址 RCW 对象。您要查找的关键字是Primary Interop Assemblies。这些是您作为原始库的供应商提供给客户参考的程序集。为了简化这一点:您正在做这项工作,当您添加对 COM 库的引用时,Visual Studio 会为您完成这项工作。您正在创建 interop assembly 并且客户没有引用类型库,而是您生成的程序集。使用tlbimp.exe 工具,可以使用/namespace 参数将RCW 类型封装在命名空间内。

【讨论】:

以上是关于在 .NET 中创建 C++ ATL COM 嵌套命名空间,如 System 命名空间的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中创建嵌套列表的最佳方法是啥?

创建可执行 COM 作为 ATL 项目并在 C# 中使用它

在另一个 COM 对象中创建一个 COM 对象

旧 c 代码到 ATL/COM dll

C++基于ATL工程编写ActiveX控件步骤

201706工作总结