中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行C#組件開發中COM和.NET對象之間的互操作

發布時間:2021-10-28 16:03:29 來源:億速云 閱讀:158 作者:柒染 欄目:編程語言

如何進行C#組件開發中COM和.NET對象之間的互操作,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

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屬性來指定

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

[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實現組件接口

每個COM組件接口的實現類也都有一個***的GUID,由Guid屬性來定定義,

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

在這個例子中我是這樣實現了這個接口的,如下:

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

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

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

regasm C:\ XMPTemplate.dll

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

Gacutil /I C:\ XMPTemplate.dll

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

com
AI

新密市| 泗洪县| 中山市| 通渭县| 玛曲县| 云梦县| 达孜县| 延津县| 梨树县| 新津县| 班玛县| 海林市| 垦利县| 松滋市| 会宁县| 浠水县| 双流县| 安化县| 百色市| 孝感市| 宜阳县| 信丰县| 西峡县| 长泰县| 常山县| 手游| 五寨县| 花莲县| 镇坪县| 宜城市| 涟水县| 抚顺县| 阳江市| 原平市| 晴隆县| 彭泽县| 渭南市| 慈溪市| 天门市| 神木县| 元氏县|