聊一聊被 .NET程序员 遗忘的 COM 组件( 二 )


有了代码 , 接下来还要做三个配置 。

  • 对 COM 的可见性
修改 AssemblyInfo.cs 中的 ComVisible = true , 参考如下:
// Setting ComVisible to false makes the types in this assembly not visible// to COM components.If you need to access a type in this assembly from// COM, set the ComVisible attribute to true on that type.[assembly: ComVisible(true)]
  • 生成签名
一般来说 , 将 com 放到 注册表 , 最好都生成一个强签名 , 否则会有警告提示 。
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
  • 注册 com 互操作
在属性面板中 , 选择 Build 选项卡 , 选中 Register for COM interop 选项即可 。
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
3. 注册 COM 到注册表要将 com组件 放到注册表 , 需要使用注册表编辑工具 regasm
Microsoft Windows [版本 10.0.19042.746](c) 2020 Microsoft Corporation. 保留所有权利 。C:\Users\Administrator>cd /d C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64>C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe D:\net6\ConsoleApp1\FlyCom\bin\Debug\FlyCom.dll /tlb:FlyCom.tlb/CodeBaseMicrosoft .NET Framework 程序集注册实用工具版本 4.8.4084.0(适用于 Microsoft .NET Framework 版本 4.8.4084.0)版权所有 (C) Microsoft Corporation 。保留所有权利 。成功注册了类型成功注册了导出到“D:\net6\ConsoleApp1\FlyCom\bin\Debug\FlyCom.tlb”的程序集和类型库C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64>从输出中可以看到已成功注册 , 并且生成了一个 FlyCom.tlb 代理文件 , 接下来可以到注册表中验证一下 GUID=270C3ED3-053D-4324-9176-9C3FA2BE58A7 注册项以及别名为 FlyCom.Show 的注册项 。
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
4. 使用 C++ 调用要想 C++ 调用 C# 写的 COM 组件 , 就像 RPC 调用一样 , 直接自动生成的代理文件即可 , 将 FlyCom.tlb 复制到 根目录 , 并且将程序改成 Win32 位 , 截图如下:
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
接下来就是完整的 C++ 代码 。
#include <Windows.h>#include <string.h>#include <iostream>#import "FlyCom.tlb" named_guids raw_interface_onlyusing namespace std;int main(){ CoInitialize(NULL); FlyCom::BaseFlyPtr ptr; ptr.CreateInstance("FlyCom.Show"); wchar_t* c = ptr->Show(L"hello world"); wprintf(L"%s", c); getchar();}将程序跑起来后 , 真的很完美 。
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
从 C++ 调用 COM 的流程图可以很清楚的看到 , 这是面向接口编程的方式 , 非常完美 。
三:COM 多语言互通原理1. 架构图千言万语不及一张图 。
聊一聊被 .NET程序员 遗忘的 COM 组件

文章插图
这就是 COM 能够实现多语言互通的规范 , 熟悉 C++ 的朋友肯定知道 vtable

经验总结扩展阅读