亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

第十三講:關于.NET組件

2019-11-18 12:11:37
字體:
來源:轉載
供稿:網友

  .NET組件是什么
  組件的定義有多種,但最常見有幾種。組件是可互換的軟件部分,它既是工業化系統的產物,也是工業第系統的動力。在.NET平臺的組件層中,組件是以Assemblies的形式創建的。
  .NET平臺創建了組件,并將組件作為其基本的元素。從本質上看,.NET平臺組件是一個用任何.NET語言以插件形式開發的可互換的軟件部件,它可以與其他應用程序實現互操作。使用COM+服務的.NET組件被稱作服務化組件,以示與.NET中標準的可治理組件的區別。
  強命名.NET組件
  下面我們將討論強命名組合體(.NET組件)是什么。當開發可配置類時,它必須被編譯。在編譯代碼后,有二方面的事情需要考慮。第一,COM+集成要求被編譯的組合體必須被強命名。我們必須通過運行被稱為sn.exe的強命名工具生成一個密碼,以生成一個強命名的組合體。一旦編譯了強命名的組合體,必須使用System.Reflection名字空間中一個被稱作AssemblyKeyFileAttribute的組合體級的屬性調用存儲在文件中的該密碼。
  #using
  using System;
  using System::EnterPRiseServices;
  using System::Reflection;
  
  [assembly: applicationName("FirstApp")]
  [assembly: ApplicationActivation(ActivationOption.Library)]
  
  // AssemblyKeyFile屬性調用由sn.exe生成的密碼文件,組合體將擁有強命名
  [assembly: AssemblyKeyFile("thiskeyfile")]
  
  namespace ESExample
  {
  ???
  }
  
  第二,在編譯強命名的組合體時,必須調用輸出System.EnterpriseServices名字空間中類型的組合體━━System.EnterpriseServices.dll。下面是生成密碼和編譯可配置類的命令:
  sn -k thiskeyfile
  Cl /out:ThisExample.dll /t:library
  /r:System.EnterpriseServices.dll FirstCfgClass.cpp
  
  在COM+中注冊.NET組件
  COM+有二種注冊方式:動態方式和手工方式。這二種方式都相當簡單,但對于本例,動態方式是合適的。動態注冊方式還有一些要求:
  1、組合體必須是強命名的。
  2、組合休可以不在全局性的組合體緩沖區中。
  3、組合體必須被可治理的(.NET)客戶端使用。
  4、組合體激活類型必須是Library。
  初看起來,似乎限制相當嚴格,但其實它包括多種情況。讀者一定在想,激活類型必須是Library,但還沒有創建過Library COM+組件呢。在.NET中,服務組件的客戶端在同一臺計算機上,或者客戶端將遠程訪問代理應用程序,以訪問COM+組件。因此,純.NET解決方案將在大多數情況下使用動態注冊方式。
  在客戶端第一次實例化服務化組件時,就會進行動態注冊,而且對于每個版本的組合體而言,只會注冊一次。我們需要注重COM+目錄更新和組件第一次被訪問之間在時間上的滯后。代碼將跟蹤內存中對象的數量以及在一定的活動期間及其之后仍然有多少對象仍然是活動的。
  注重,在對對象進行初次調用后,系統中存在一個有5個對象的緩沖池。似乎是一旦一個對象被實例化,在有方法被調用之前,它一直是活動的。一旦有方法被調用,該對象就只在調用期間是活動的。這也提醒我們,在預備使用對象之前,盡量不要去招惹它們。
  移植的策略
  在決定將部分或全部現有的應用軟件移植到.NET環境中,就需要決定哪種移植方法最適合你。本篇文章介紹了水平移植和垂直移植二種應用軟件的移植方式。
  水平移植和垂直移植
  水平移植是指取代應用程序中的全部一個層。例如,可以選擇取代基于Web的表示層中的asp代碼或選擇取代中間層中的COM代碼。垂直移植指的是替換一個應用程序中所有n層中的一部分。
  組件設計
  本篇文章提出了一些與向.NET/COM移植和組件設計互操作性問題方面的普遍原則。通過互操作層在.NET和 COM環境之間進行互操作時,CCW或RCW(依據調用的方向而不同)必須在二個環境之間的調用棧中對數據進行轉化,有些數據類型無需轉換。包括整型、長整型和浮點型數據類型在內的通用性數據無需轉換,而非通用性數據則需要轉換。
  Visual Basic的BSTR是非通用性數據類型的一個例子。在向.NET移植應用程序之前,應該在可治理性和非可治理性代碼之間盡量少地使用非通用性數據類型,原因是相關的轉換代價將影響到應用程序的性能。
  通用數據類型
  大多數的數據類型在可治理性和非可治理性內存中的表示都相同,互操作層無需作非凡的處理,由于在可治理和非可治理代碼之間無需轉換,因此這些數據類型被稱作通用類型。整型和浮點型數據是通用類型數據類型,由通用型數據類型組成的數組和結構也是通用型數據類型。
  非通用數據類型
  非通用數據類型在可治理和非可治理語言中的表示是不同的,由于當在可治理性和非可治理性代碼之間進行互操作時,它們要求互相轉換,因此被稱作非通用型數據類型。例如,由于有幾種不同的非可治理性表示,其中的一些可能需要進行轉換,因此,可治理的字符串是非通用型數據類型。字符串、日期、對象是非通用型數據類型的例子,在執行互操作時,它們都需要轉換。
  現有的COM組件和可治理客戶端
  在向.NET平臺移植應用程序時,需要考慮現有的COM組件所使用的界面。盡管會不再使用現有的COM客戶端,仍然會在.NET客戶端中使用現有的COM組件。因此,在設計界面時,應該如何既考慮到二種環境中現有的組件也要考慮到未來的可治理客戶端。
  在向.NET移植組件時,需要使用tlbimp工具自動地生成一個應用程序的RCW。缺省情況下,RCW使用與現有組件相同的界面(通過定義相同和屬性和方法)。在許多情況下,傳統的COM類型的界面并不是天生地從可治理性代碼中使用的??芍卫硇源a開發人員將能夠充分地利用下面的特性:
  ·參數化的構造器
  ·繼續
  ·靜態方法
  我們應當考慮編寫一個COM對象使用的自定義包裝類,向可治理客戶端提供這些能力,創建更適合可治理代碼環境的界面。包裝類在內部使用COM組件的RCW,并代理對現有COM組件的大多數調用,一些調用能夠完成更復雜的數據類型轉換工作,例如,ADO .NET數據集和ADO記錄集之間的映射。此后,我們可以將更多的功能從COM組件轉移到包裝類中,而不會影響可治理代碼。在決定是使用RCW或自定義的可治理性包裝類時,有許多因素需要考慮。需要注重的是,TlbImp工具能夠將COM類型庫轉換為.NET架構元數據。一旦類型庫被轉換為元數據,可治理客戶端可以無縫地調用COM類型。為了簡化使用,我們總是在類型庫中提供類型信息。
  假如組件有大量的已經習慣了現有對象模型的客戶端,創建RCW和使用現有的界面就是一個比較合適的策略。Excel中的對象模型被使用VBA的Excel開發人員廣泛使用,對象模型是高度結構化的,并且能夠很好地映射由Excel提供的特性和用戶界面??蛻舴浅J煜がF有的對象模型,假如對象模型發生大幅度的變化,用戶就需要進行大量的練習。在本例中,使用標準的RCW可能是合適的。
  在編寫COM界面的自定義的可治理包裝類時,這些界面將被通過RCW從可治理性代碼中調用,每個屬性調用都需要有互操作層的參與,會帶來一定的代價。對于一個只作很少工作的簡單界面來說,互操作造成的代價將是30-50條匯編指令。對于完成大量工作的方法而言,這點代價是微不足道的,但對于一個簡單的屬性訪問而言,這一代價還是太大了。
  假如在不久之后要將COM組件的客戶端移植到.NET平臺上,在考慮編寫自定義的可治理包裝類時,應當將界面的功能由COM組件轉到包裝類中,否則,可以在COM對象中實現界面,并被代理到可治理的包裝類中。
  通過重新安排代碼,我們能夠使互操作層的代價最小,并擁有一個從可治理代碼到對象的最簡單自然的界面。編寫自定義的可治理包裝類的帶來的另一個好處是可以移動遠程對象的分界線。
  類的界面的實現
  在可治理代碼中,類的界面的定義并不是顯性的,該界面包含適用于.NET對象使用的所有公共方法、屬性、域和事件。它可以是一個雙重或者僅起調度作用的界面,類界面的名字為.NET類名字前加一下劃線。例如,對于Mammals而言,類界面的名字是_Mammals。對于派生類而言,類界面也需要實現基本類所有的公共方法、域和屬性,派生類還實現每個基本類的界面。例如,Mammals類擴展了類MammalMainclass,.NET對象向COM客戶端提供三個名字為_Mammals、_MammalMainclass和_Object的界面。
  COM客戶端能夠獲得名字為Mammals的類界面,該界面定義在由類型庫輸出向導(TlbeXP.exe)工具生成的類型庫中。假如Mammals類實現一個或多個界面,這些界面將出現在coclass中。
  [odl, uuid(0000...0000), hidden, dual, nonextensible, oleautomation]
  interface _Mammals : IDispatch
  {
  [id(0x00000000), propget] HRESULT ToString([out, retval] BSTR*
  pRetVal);
  [id(0x60020001)] HRESULT Equals([in] VARIANT obj, [out, retval]
  VARIANT_BOOL* pRetVal);
  [id(0x60020002)] HRESULT GetHashCodes([out, retval] short* pRetVal);
  [id(0x60020003)] HRESULT GetType([out, retval] _Type** pRetVal);
  [id(0x6002000d)] HRESULT EatIt();
  [id(0x6002000e)] HRESULT GetBreathe();
  [id(0x6002000f)] HRESULT GoSleep();
  }
  [uuid(0000...0000)]
  coclass Mammals
  {
  [default] interface _Mammals;
  }
  類界面生成是可選的。假如沒有選擇其他選項,COM互操作層為每個輸出到類庫中的類生成一個只起調度作用的界面,通過在類中添加ClassInterfaceAttribute屬性,我們可以中止或修改這一界面的自動創建。盡管類界面能夠使我們無須向COM提供可治理

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内精品国产三级国产在线专| 中文在线资源观看视频网站免费不卡| 成人久久精品视频| 午夜免费久久久久| 国产日韩av在线| 欧美一级视频免费在线观看| 日韩在线激情视频| 最近2019中文字幕一页二页| 91精品国产99久久久久久| 久久久久久久国产精品视频| 91精品国产91久久久久久| 在线观看国产精品91| 亚洲一区二区久久久久久| 欧美专区在线视频| 最新69国产成人精品视频免费| 黑人极品videos精品欧美裸| 久久精品在线播放| 久久久久久亚洲精品| 亚洲欧美激情视频| 日韩成人中文字幕在线观看| 亚洲小视频在线| 欧美壮男野外gaytube| 日韩视频第一页| 青青草原一区二区| 日韩精品日韩在线观看| 亚洲高清av在线| 国产z一区二区三区| 欧美日韩国产中文字幕| 精品一区精品二区| 欧美精品激情在线| 影音先锋欧美精品| 国产精品第七十二页| 日韩精品极品视频免费观看| 亚洲久久久久久久久久久| 日本精品性网站在线观看| 欧美激情在线有限公司| 亚洲欧美在线免费观看| 国产一区二区黄| 亚洲国产精品久久91精品| 91亚洲精品一区| 国产ts一区二区| 欧美色欧美亚洲高清在线视频| 成人性生交xxxxx网站| 欧美高清videos高潮hd| 日韩欧美一区二区三区久久| 北条麻妃一区二区三区中文字幕| 亚洲人精品午夜在线观看| 久久精品久久久久电影| 亚洲人成电影在线播放| 亚洲精品久久久久久久久久久| 中文字幕av一区| 中文国产亚洲喷潮| 亚洲精品自拍视频| 欧美中文字幕在线播放| 亚洲女人天堂av| 久久免费国产精品1| 精品爽片免费看久久| 中文字幕免费国产精品| 亚洲va久久久噜噜噜久久天堂| 91免费在线视频网站| 一区二区三区回区在观看免费视频| 国产亚洲精品久久久久久| 九九热99久久久国产盗摄| 久久九九有精品国产23| 操日韩av在线电影| 国产精品一区二区三区毛片淫片| 国内精品美女av在线播放| 一区二区亚洲欧洲国产日韩| 九色精品免费永久在线| 国内精品视频一区| 亚洲成**性毛茸茸| 91色在线视频| 亚洲精品不卡在线| 日本久久久久亚洲中字幕| 午夜欧美大片免费观看| 91夜夜未满十八勿入爽爽影院| 国产99视频在线观看| 中文字幕九色91在线| 色综合导航网站| 日韩免费在线免费观看| 日韩福利伦理影院免费| 久久香蕉频线观| 久久久久久久久国产精品| 久久久久久久久久久网站| 亚洲精品欧美日韩专区| 国产a∨精品一区二区三区不卡| 这里只有精品在线播放| 亚洲大胆人体av| 久久综合电影一区| 美女精品久久久| 成人www视频在线观看| 久久久久久久一区二区| 国产精品入口尤物| 91久久精品日日躁夜夜躁国产| 亚洲情综合五月天| 久久亚洲精品国产亚洲老地址| 日产日韩在线亚洲欧美| 久久久视频精品| 亚洲国产精品一区二区久| 91中文字幕一区| 成人xxxx视频| 成人免费视频xnxx.com| 韩曰欧美视频免费观看| 亚洲欧美成人网| 欧美日韩一区二区三区| 一区二区三区高清国产| 国产成人短视频| 欧美精品videos| 国产精品成人国产乱一区| xxx欧美精品| 欧美日本亚洲视频| 欧美最猛黑人xxxx黑人猛叫黄| 日韩在线视频线视频免费网站| 2020欧美日韩在线视频| 亚洲九九九在线观看| 日韩免费黄色av| 成人av在线网址| 国产日韩换脸av一区在线观看| 亚洲人成伊人成综合网久久久| 一区二区三区四区精品| 欧美激情女人20p| 精品视频久久久久久| 欧美激情中文字幕在线| 宅男66日本亚洲欧美视频| 亚洲理论电影网| 国产精品专区一| 97人人做人人爱| 欧美裸身视频免费观看| 欧美一区三区三区高中清蜜桃| 国产精品6699| 97在线视频精品| 668精品在线视频| 久久精品国产精品| 国产精品色婷婷视频| 国产精品h在线观看| 中文字幕在线视频日韩| 91精品在线观| 日韩69视频在线观看| 一区二区欧美久久| 欧美午夜激情在线| 97在线观看视频| 日av在线播放中文不卡| 91九色综合久久| 亚洲xxxxx| 国产精品吹潮在线观看| 欧美国产亚洲视频| 欧美富婆性猛交| 国产精品视频网址| 欧美成人免费va影院高清| 黑人精品xxx一区一二区| 美女av一区二区| 国产精品999999| 久久久av亚洲男天堂| 国产成人久久精品| 久久久国产成人精品| 成人久久一区二区三区| 日韩大陆欧美高清视频区| 欧美日韩亚洲系列| 日韩亚洲第一页| 欧美激情网站在线观看| 欧美专区在线观看| 亚洲97在线观看| 国产97色在线| 欧洲成人免费aa|