用C#编写一个进程外的COM组件

本文介绍了如何使用C#编写一个进程外的COM组件,避免了COM客户端必须加载CLR和.NET组件到自身进程。通过自定义ClassFactory,注册CoRegisterClassObject,CoRevokeClassObject以及处理跨进程接口传递,实现了.NET的进程外COM互操作。文章提供了NET代码、注册表代码和客户端C++、VB Script的示例。
摘要由CSDN通过智能技术生成

我在以前的一篇文章《COM互操作 - VB 脚本里面使用.NET类型》里面写过如何在COM客户端程序里面使用.NET组件,但是这些.NET组件都属于进程内的组件,即COM客户端需要将CLR.NET组件都加载进自身进程的内存空间里面才能使用。上一次在MSDN中文论坛上看到有网友问如何使用C#编写一个进程外的COM组件,由于在使用regasm.exe注册.NET组件的时候,regasm.exe.NET组件里面发布的COM可见的类型对应CLSID的键值里加上了InprocServer32项,并且设置值为mscoree.dll。这也就是说,.NET的默认实现强制了我们只能在COM里面激活进程内的.NET组件,但是如何用.NET实现进程外的组件呢?难道真的要我们写一个新的COM程序来Host CLR?

答案是否定的,这里是另外一个替代方案,你需要完成下面这些步骤:

1.       C#代码里面自己实现一个ClassFactory,用来激活我们的Com可见的(Com Visible)类型。

2.       调用COM API CoRegisterClassObject将我们自己的ClassFactory注册在COM库里面,以便监听COM的激活申请。

3.       COM端使用完毕以后,可以通过调用CoRevokeClassObject撤销我们ClassFactoryCOM库里面的注册。

4.       如果我们的COM客户端是C++编写的话,并且采用前绑定接口的方式使用我们的Com可见(Com Visible)类型的话,为了能够将接口指针跨越进程边界传输,你还需要将.NET Assembly生成的Tlb文件注册,向COM库注册列集(Marshaling)接口的方法。

NET 代码

TestComVisibleClass.cs

1. using System;

2. using System.Runtime.InteropServices;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值