有了代码 , 接下来还要做三个配置 。
- 对 COM 的可见性
// 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 互操作
Register for COM interop
选项即可 。
文章插图
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
的注册项 。
文章插图

文章插图
4. 使用 C++ 调用要想 C++ 调用 C# 写的 COM 组件 , 就像 RPC 调用一样 , 直接自动生成的代理文件即可 , 将
FlyCom.tlb
复制到 根目录 , 并且将程序改成 Win32
位 , 截图如下:
文章插图
接下来就是完整的 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();}
将程序跑起来后 , 真的很完美 。
文章插图
从 C++ 调用 COM 的流程图可以很清楚的看到 , 这是面向接口编程的方式 , 非常完美 。
三:COM 多语言互通原理1. 架构图千言万语不及一张图 。

文章插图
这就是 COM 能够实现多语言互通的规范 , 熟悉 C++ 的朋友肯定知道
vtable
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 直行车道右转被拍几率大不大
- 细聊.Net Core中IServiceScope的工作方式
- 被正式确诊为xx是什么梗
- 密接和次密接一般多久会被通知 密接者与次密接者通常多久会被通知
- 哪几个星座的真心最容易被喜欢的人无视
- 美女被迫嫁丑男是哪部电视剧?
- 我的世界马怎么驯服怎么判断马被完全驯服(我的世界如何驯服马教程)
- 遇人不淑分手后还会被前任抹黑的星座女
- 防盗门锁芯自己能换吗 锁芯被卡住的原因
- 火灾最容易被熄灭的阶段是