C#组件开发:COM和.NET对象之间的互操作

开发 后端
Microsoft在解决和以往的COM和SDK开发技术之间的互操作性(Interoperability)方面做了很多的工作,其中包括COM和.NET对象之间的相互调用以及.NET如何调用SDK中的Windows库函数。本文试图用一种实践的方式探索C#组件开发以及相关的技术。

C#组件发展历史

在面向对象技术发展的初期开始暴露出来了很多的问题,其中一个就是随着系统的复杂度不断上升,系统的类开始出现爆炸,而且对象之间的调用依赖无法在一个更高的抽象层次上彼此之间的松散耦合,这也因此导致了这种基于源代码的复用方式变得非常脆弱。基于组件的开发技术很好地解决了上面的问题,它在组件(某个功能的聚合,是一个类的集合)这个层次上实现了抽象和复用。在这个时期,COM(Component Object Model)技术作为这么一种方法论的实现方式开始展现它独特的魅力,而Microsoft则带领着IT界把这一技术推向了稳定、成熟。

而到了20世纪90年代末期,随着商业逻辑处理的复杂化以及很多个性化的需求的出现,软件复杂度也开始提高,COM技术在应用技术领域也开始显得力不从心了。在这个时候就需要一种更灵活的、基于标准的技术来支撑应用软件的开发,.NET作为一个具有跨时代意义的应用软件的开发平台悄然而至。.NET以一种基于平台方式(应用软件依赖于某个平台,可移植性依赖于平台),又在一个更高的层次上实现了软件的复用。

问题描述

为了保持.NET和COM技术的可互操作性,Microsoft提供一个专门的组件来解决这个问题,可以参考命名空间System.Runtime.InteropService。它不为.NET对原有的COM组件的调用提供了一种有效的方式,同时也为用.NET编写COM组件提供一种便利。

C#组件开发步骤

Step 1构建.NET组件

新建一个.NET组件

设置这个.NET组件的COM可见性

设置工程属性:“生成”-> “为COM Interop注册”。

当然也可以为每个接口设置COM可见性,ComVisibleAttribute类提供了这样的控制。

Step 2定义组件接口

每个COM组件接口都有一个***的GUID,在.NET接口的定义中由Guid属性来指定

在这个例子中我定义了如下的接口:

  1. [TypeLibType(4160)]  
  2. [Guid("F0485D81-59C1-44b1-9316-D474E26C026E")]   
  3. public interface IXMPReader  
  4. {  
  5.     [DispId(0)]  
  6.     string Metadata { get;set;}  
  7.     [DispId(1)]  
  8.     IXMPTemplate ReadTemplate(string xPath);  
  9. }  

Step 3实现组件接口

每个COM组件接口的实现类也都有一个***的GUID,由Guid属性来定定义,

在IDL中对组件类的定义需要有一个Default(默认实现的接口声明), 在.NET组件中由ComDefaultInterface属性来定义。

在这个例子中我是这样实现了这个接口的,如下:

  1. namespace XMPTemplate  
  2. {  
  3.     [TypeLibType(4160)]  
  4.     [Guid("AD665240-9E4D-4c30-9475-023EA44E41BD")]  
  5.     [ComDefaultInterface(typeof(IXMPReader))]  
  6.     [ComSourceInterfaces(typeof(IXMPReader))]  
  7.     public class XMPReader : IXMPReader  
  8.     {  
  9.         private string _metadata="";  
  10.         public string Metadata  
  11.         {  
  12.             get { return _metadata; }  
  13.             set { _metadata = value; ; }  
  14.         }  
  15.         public IXMPTemplate ReadTemplate(string xPath)  
  16.         {  
  17.                 XmlDocument document = new XmlDocument();  
  18.                 document.LoadXml(Metadata);  
  19.                 XmlNode node = document.SelectSingleNode(xPath);  
  20.                 XMPTemplate template = new XMPTemplate();  
  21.                 template.LoadXml(node.InnerXml);  
  22.                 return template;  
  23. }  
  24.     } 

Step 4部署

假设我们生成的.NET组件的名称是XMPTemplate.dll,访问路径为C:\ XMPTemplate.dll

利用Regasm工具来注册.NET组件

regasm C:\ XMPTemplate.dll

将这个.NET组件加入到全局程序集缓存中

Gacutil /I C:\ XMPTemplate.dll

开发C#组件而实现COM和.NET对象之间的互操作就介绍到这里。

【编辑推荐】

  1. 浅谈C#中构造函数和成员函数
  2. C#函数的参数返回结构数组
  3. 概述ASP.NET中的NGWS Runtime
  4. C#函数与JavaScript函数
  5. 详解C# Object.Equals函数 

责任编辑:book05 来源: cnblogs
相关推荐

2009-09-22 17:53:32

C# COM组件开发

2009-09-01 09:38:45

COM互操作性

2009-12-09 10:51:18

ibmdwJava

2009-08-21 09:14:47

C# Excel CO

2009-09-02 16:43:55

C#调用Excel的C

2009-08-20 11:03:34

Visual C#使用

2009-08-10 13:34:11

创建C# COM对象

2009-09-01 15:24:59

C++、C#和JAVA

2009-08-21 17:45:40

C#调用COM对象

2009-08-03 11:32:49

C#调用COM对象

2009-09-24 15:10:54

C#调用COM组件

2009-08-10 13:40:46

创建C# COM对象

2010-03-17 12:32:07

ASP.NETjQuery开源社区

2009-08-19 14:35:12

C++和C#相互调用C

2009-06-08 10:49:00

JavaFX互操作性Java互操作性

2009-09-18 19:09:41

C# COM组件

2009-02-04 17:11:28

JavaFXJava兼容性

2009-08-31 15:34:45

常用操作C# TreeView

2009-09-24 14:59:38

C#编写COM组件

2009-07-03 10:33:07

C#创建COM组件
点赞
收藏

51CTO技术栈公众号