自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#組件開發(fā):COM和.NET對象之間的互操作

開發(fā) 后端
Microsoft在解決和以往的COM和SDK開發(fā)技術(shù)之間的互操作性(Interoperability)方面做了很多的工作,其中包括COM和.NET對象之間的相互調(diào)用以及.NET如何調(diào)用SDK中的Windows庫函數(shù)。本文試圖用一種實(shí)踐的方式探索C#組件開發(fā)以及相關(guān)的技術(shù)。

C#組件發(fā)展歷史

在面向?qū)ο蠹夹g(shù)發(fā)展的初期開始暴露出來了很多的問題,其中一個就是隨著系統(tǒng)的復(fù)雜度不斷上升,系統(tǒng)的類開始出現(xiàn)爆炸,而且對象之間的調(diào)用依賴無法在一個更高的抽象層次上彼此之間的松散耦合,這也因此導(dǎo)致了這種基于源代碼的復(fù)用方式變得非常脆弱?;诮M件的開發(fā)技術(shù)很好地解決了上面的問題,它在組件(某個功能的聚合,是一個類的集合)這個層次上實(shí)現(xiàn)了抽象和復(fù)用。在這個時期,COM(Component Object Model)技術(shù)作為這么一種方法論的實(shí)現(xiàn)方式開始展現(xiàn)它獨(dú)特的魅力,而Microsoft則帶領(lǐng)著IT界把這一技術(shù)推向了穩(wěn)定、成熟。

而到了20世紀(jì)90年代末期,隨著商業(yè)邏輯處理的復(fù)雜化以及很多個性化的需求的出現(xiàn),軟件復(fù)雜度也開始提高,COM技術(shù)在應(yīng)用技術(shù)領(lǐng)域也開始顯得力不從心了。在這個時候就需要一種更靈活的、基于標(biāo)準(zhǔn)的技術(shù)來支撐應(yīng)用軟件的開發(fā),.NET作為一個具有跨時代意義的應(yīng)用軟件的開發(fā)平臺悄然而至。.NET以一種基于平臺方式(應(yīng)用軟件依賴于某個平臺,可移植性依賴于平臺),又在一個更高的層次上實(shí)現(xiàn)了軟件的復(fù)用。

問題描述

為了保持.NET和COM技術(shù)的可互操作性,Microsoft提供一個專門的組件來解決這個問題,可以參考命名空間System.Runtime.InteropService。它不為.NET對原有的COM組件的調(diào)用提供了一種有效的方式,同時也為用.NET編寫COM組件提供一種便利。

C#組件開發(fā)步驟

Step 1構(gòu)建.NET組件

新建一個.NET組件

設(shè)置這個.NET組件的COM可見性

設(shè)置工程屬性:“生成”-> “為COM Interop注冊”。

當(dāng)然也可以為每個接口設(shè)置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實(shí)現(xiàn)組件接口

每個COM組件接口的實(shí)現(xiàn)類也都有一個***的GUID,由Guid屬性來定定義,

在IDL中對組件類的定義需要有一個Default(默認(rèn)實(shí)現(xiàn)的接口聲明), 在.NET組件中由ComDefaultInterface屬性來定義。

在這個例子中我是這樣實(shí)現(xiàn)了這個接口的,如下:

  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部署

假設(shè)我們生成的.NET組件的名稱是XMPTemplate.dll,訪問路徑為C:\ XMPTemplate.dll

利用Regasm工具來注冊.NET組件

regasm C:\ XMPTemplate.dll

將這個.NET組件加入到全局程序集緩存中

Gacutil /I C:\ XMPTemplate.dll

開發(fā)C#組件而實(shí)現(xiàn)COM和.NET對象之間的互操作就介紹到這里。

【編輯推薦】

  1. 淺談C#中構(gòu)造函數(shù)和成員函數(shù)
  2. C#函數(shù)的參數(shù)返回結(jié)構(gòu)數(shù)組
  3. 概述ASP.NET中的NGWS Runtime
  4. C#函數(shù)與JavaScript函數(shù)
  5. 詳解C# Object.Equals函數(shù) 

責(zé)任編輯:book05 來源: cnblogs
相關(guān)推薦

2009-09-01 09:38:45

COM互操作性

2009-09-22 17:53:32

C# COM組件開發(fā)

2009-08-10 13:34:11

創(chuàng)建C# COM對象

2009-12-09 10:51:18

ibmdwJava

2009-08-21 09:14:47

C# Excel CO

2009-09-02 16:43:55

C#調(diào)用Excel的C

2009-09-01 15:24:59

C++、C#和JAVA

2009-08-21 17:45:40

C#調(diào)用COM對象

2009-08-03 11:32:49

C#調(diào)用COM對象

2009-08-10 13:40:46

創(chuàng)建C# COM對象

2009-08-20 11:03:34

Visual C#使用

2009-09-24 15:10:54

C#調(diào)用COM組件

2010-03-17 12:32:07

ASP.NETjQuery開源社區(qū)

2009-06-08 10:49:00

JavaFX互操作性Java互操作性

2009-08-19 14:35:12

C++和C#相互調(diào)用C

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組件

2025-01-26 12:33:17

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號