COM与.NET(一)用.NET写COM组件

    在很多情况下我们都是要在.NET中使用COM,这个话题的资料很多,随便拿一本将.NET或C#的书上都有。最近碰到一个C++环境中要使用.NET开发中的东西。

    这种需求可以有很多种实现方式,只考虑通信的话那可以使用WINSOCK,名字管道,邮槽等等。但除了通信之外还需要考虑一个问题就时,C++怎么识别你.NET中的数据结构,例如:C++中怎么识别System.Data.DataSet?有人会说拿使用CLI/C++好了,这种方法实际使用并不是很理想(其中Managed是可以很方便的调用Natived的代码,这个互操作没有那恶心的DllImport,object^也可以比较方便的编程销指针,但是反过来就不灵了,还有就是C++调用方同意使用CLI/C++吗?)。

    在很多条件权衡之下选择了COM,有人也会说那样COM也还是识别不了System.Data.DataSeta啊。为了开发效率所做的退而求其次的做法。好了言归正传,怎么用用.NET写COM组件。代码如下:

  1.     [ComVisible(true)]
  2.     [InterfaceType(ComInterfaceType.InterfaceIsDual)]
  3.     [Guid("C6D664F5-6CF6-4c12-9948-8A40B16818BE")]
  4.     public interface ISayHello
  5.     {
  6.         string SayHello(string user);
  7.     }
  8.     [ComVisible(true)]
  9.     [Guid("B1CC1F01-C7F9-4aac-964F-D0D66FBD8018")]
  10.     public class CSayHello : ISayHello
  11.     {
  12.         #region ISayHello Members
  13.         public string SayHello(string user)
  14.         {
  15.             return string.Format("say hello to {0}!", user);
  16.         }
  17.         #endregion
  18.     }

    其中[ComVisible(true)]特性表示,将此数据结构对COM可见,后面导出时跟句此标识才导出。也可以在AssemblyInfo.cs文件中。

  1. // Setting ComVisible to false makes the types in this assembly not visible 
  2. // to COM components.  If you need to access a type in this assembly from 
  3. // COM, set the ComVisible attribute to true on that type.
  4. [assembly: ComVisible(false)]

将false改为true,但这就是对该程序集中的所有数据结构都启用了。

[InterfaceType(ComInterfaceType.InterfaceIsDual)]特性只可以修饰接口,表示以双重接口向COM公开,不加时为默认该方式。

[Guid("B1CC1F01-C7F9-4aac-964F-D0D66FBD8018")]这个就对应COM中的IID(接口)和CLSID(实现)。不加会默认随机给。可以在VS->Tool->Create Guid工具中创建需要的GUID。当然也可以通过代码:Guid.NewGuid().ToString()得到。

    对了还有一件事情不可以忘记,[assembly: AssemblyKeyFile("SayHello.snk")](在2.0后可以在 项目属性->签名->程序集签名 配置即可)给我们的程序集加上强命名。其实也可以不加强命名的,后面在专门讲强命名中再叙。这样C#所需的工作就完成了,接下来就时部署和使用了。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值