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

概述創(chuàng)建C# COM對(duì)象

開發(fā) 后端
本文介紹創(chuàng)建C# COM對(duì)象成員聲明,以及介紹聲明的JetEngineClass類只有一個(gè)單單的類聲明,但是沒有一個(gè)成員聲明。

直接成員聲明的類

可能很多程序員對(duì)于這個(gè)不太理解這是什么意思,沒關(guān)系咱還是"用代碼來(lái)說話".

  1. [ComImport,Guid("DE88C160-FF2C-11D1-BB6F-00C04FAE22DA")]  
  2. publicclassJetEngineClass  
  3. {  
  4. }  
  5.  
  6. [ComImport,CoClass(typeof(JetEngineClass)),Guid("9F63D980-FF25-11D1-BB6F-00C04FAE22DA")]  
  7. publicinterfaceIJetEngine  
  8. {  
  9. voidCompactDatabase(  
  10. [In,MarshalAs(UnmanagedType.BStr)]stringSourceConnection,  
  11. [In,MarshalAs(UnmanagedType.BStr)]stringDestconnection  
  12. );  
  13. voidRefreshCache([In,MarshalAs(UnmanagedType.Interface)]objectConnection);  
  14. }  
  15.  
  16. JetEngineClassengine=newJetEngineClass();  
  17. IJetEngineiengine=engineasIJetEngine;  
  18. //iengine即是所要用的接口的引用 

大家看到了上面聲明的JetEngineClass類只有一個(gè)單單的類聲明,但是沒有一個(gè)成員聲明,但是和一般的類聲明有些不一樣的是這個(gè)類多了兩個(gè)特性(Attribute),把這個(gè)類和COM對(duì)象聯(lián)系在一起的就是這兩個(gè)特性了,其中一個(gè)是ComImportAttribute,這個(gè)特性指明了所作用的類是從COM對(duì)象中來(lái)的,GuidAttribute指明了COM對(duì)象的GUID,也就是說明了創(chuàng)建C# COM對(duì)象需用到的GUID。有了這兩個(gè)特性以后,這個(gè)類就不是一個(gè)普通的類了,當(dāng)我們使用new去創(chuàng)建實(shí)例的時(shí)候,CLR看到了聲明的這兩特性就知道要?jiǎng)?chuàng)建的是一個(gè)COM對(duì)象,根據(jù)提供的GUID也就能創(chuàng)建出指定的COM對(duì)象,并和new返回的對(duì)象實(shí)例關(guān)聯(lián)在一起了。

終上4種方法我們可以看出來(lái),***種方式只對(duì)特定的COM對(duì)象有效,不具有通用性;第二種方式只需要知道COM對(duì)象的CLSID或PROGID就可以了,是我們?cè)?NET里平時(shí)比較常用的創(chuàng)建C# COM對(duì)象的方法;第三種方式需要自己聲明一個(gè)外部方法,而且需要傳入若干的參數(shù),還需要知道COM對(duì)象模型,是單線程呢還是多線程,進(jìn)程內(nèi)呢還是進(jìn)程外,兩個(gè)字"麻煩"。對(duì)CoCreateInstance這個(gè)方法不是很熟悉的人來(lái)說,用起來(lái)就不那么順手了;第四種方式用起來(lái)最像是.NET的方式,也最簡(jiǎn)單省事,和其它.NET對(duì)象的創(chuàng)建方式最為接近。四種方法各有各有好處,我覺得簡(jiǎn)單的COM對(duì)象,用第二種和第四種是***的(我個(gè)人來(lái)說最喜歡第四種)又不生成額外的程序集;要是COM對(duì)象相關(guān)的比較多,比如說Excel之類的COM對(duì)象,我建議還是用導(dǎo)入類型庫(kù)包裝吧,雖然是有可能出現(xiàn)版本問題,但這種應(yīng)該很容易要求目標(biāo)機(jī)器上運(yùn)行的COM版和開發(fā)的時(shí)候一致的,更何況版本問題也不是100%出現(xiàn),只是很少一部分會(huì)出這樣的問題。最不推薦的就是第三種方式了,這種方式在我看來(lái)唯一用到的地方就是使用IntPtr作為COM對(duì)象和接口的指針的時(shí)候,或者是想要在創(chuàng)建C# COM對(duì)象的時(shí)候,對(duì)參數(shù)作最靈活的控制的時(shí)候. 因?yàn)槠渌N方式既不能返回IntPtr指針(其實(shí)也可以通過前面提到的的Marshal類的方法把.NET包裝的COM對(duì)象轉(zhuǎn)成指針),也不能提供與直接調(diào)用CoCreateInstance函數(shù)提供最全面的參數(shù)相匹配的方式。

***提個(gè)小問題

1 讀者有興趣的話可以去看看這幾種方式(不包括第三種)生成的COM對(duì)象的引用的類型是否是一致的,也就是用GetType得到的Type是否是一致的

2 大家猜猜這段代碼運(yùn)行后,iengine的類型會(huì)是什么(GetType的結(jié)果), 會(huì)和engine的類型一樣嗎?

  1. JetEngineClass engine = new JetEngineClass();  
  2. IJetEngine iengine = engine as IJetEngine;  
  3. // iengine即是所要用的接口的引用  
  4.  
  5. IntPtr p = Marshal.GetIUnknownForObject(engine);  
  6. iengine = Marshal.GetObjectForIUnknown(p) as IJetEngine; 

以上介紹創(chuàng)建C# COM對(duì)象成員聲明我這里就不給出結(jié)果了,留給讀者自行去驗(yàn)證吧。另外如果大家還發(fā)現(xiàn).NET中有其它的創(chuàng)建C# COM對(duì)象的方式也盡指教一二,本人將不甚感激.

【編輯推薦】

  1. 簡(jiǎn)單介紹C#預(yù)處理
  2. 學(xué)習(xí)C#無(wú)詞尾符號(hào)經(jīng)驗(yàn)談
  3. C#調(diào)用QuickTest自動(dòng)化
  4. 詳解C#正規(guī)表達(dá)式
  5. C#字符串插入html標(biāo)簽
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

2009-08-10 13:34:11

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

2009-08-10 14:03:08

C# COM接口

2009-08-31 09:44:23

C# Employee

2009-08-25 10:08:39

C# MyData對(duì)象

2009-08-21 17:45:40

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

2009-08-03 11:32:49

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

2009-09-02 16:02:52

C#引用托管對(duì)象

2009-07-03 10:33:07

C#創(chuàng)建COM組件

2009-08-25 17:28:23

C#創(chuàng)建DataSet

2009-08-18 17:29:02

C#使用指針

2009-08-18 09:26:07

C#線程功能

2009-08-13 15:18:23

C#文件上傳

2009-07-31 14:08:54

C# 匿名函數(shù)

2009-09-03 11:15:38

C#設(shè)置Coopera

2009-08-19 11:09:00

C# Cast<T>

2009-08-24 18:09:13

C#構(gòu)造函數(shù)

2009-08-20 16:28:45

C#匿名方法

2009-08-25 16:49:44

C#使用if語(yǔ)句

2009-08-17 09:57:00

C# Windows

2009-09-03 10:42:16

C# Employee
點(diǎn)贊
收藏

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