溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行C#組件開(kāi)發(fā)中COM和.NET對(duì)象之間的互操作

發(fā)布時(shí)間:2021-10-28 16:03:29 來(lái)源:億速云 閱讀:152 作者:柒染 欄目:編程語(yǔ)言

如何進(jìn)行C#組件開(kāi)發(fā)中COM和.NET對(duì)象之間的互操作,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

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

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

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

問(wèn)題描述

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

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

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

新建一個(gè).NET組件

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

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

當(dāng)然也可以為每個(gè)接口設(shè)置COM可見(jiàn)性,ComVisibleAttribute類(lèi)提供了這樣的控制。

Step 2定義組件接口

每個(gè)COM組件接口都有一個(gè)***的GUID,在.NET接口的定義中由Guid屬性來(lái)指定

在這個(gè)例子中我定義了如下的接口:

[TypeLibType(4160)]  [Guid("F0485D81-59C1-44b1-9316-D474E26C026E")]   public interface IXMPReader  {      [DispId(0)]      string Metadata { get;set;}      [DispId(1)]      IXMPTemplate ReadTemplate(string xPath);  }

Step 3實(shí)現(xiàn)組件接口

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

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

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

namespace XMPTemplate  {      [TypeLibType(4160)]      [Guid("AD665240-9E4D-4c30-9475-023EA44E41BD")]      [ComDefaultInterface(typeof(IXMPReader))]      [ComSourceInterfaces(typeof(IXMPReader))]      public class XMPReader : IXMPReader      {          private string _metadata="";          public string Metadata          {              get { return _metadata; }              set { _metadata = value; ; }          }          public IXMPTemplate ReadTemplate(string xPath)          {                  XmlDocument document = new XmlDocument();                  document.LoadXml(Metadata);                  XmlNode node = document.SelectSingleNode(xPath);                  XMPTemplate template = new XMPTemplate();                  template.LoadXml(node.InnerXml);                  return template;  }      }

Step 4部署

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

利用Regasm工具來(lái)注冊(cè).NET組件

regasm C:\ XMPTemplate.dll

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

Gacutil /I C:\ XMPTemplate.dll

關(guān)于如何進(jìn)行C#組件開(kāi)發(fā)中COM和.NET對(duì)象之間的互操作問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

com
AI