成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

創建C# COM對象的方法

開發 后端
本文介紹用什么方式創建C# COM對象也成了我們必須面對的一個問題.據我所知道的創建C# COM對象的方法一共有幾種。

用C#做WinForm程序,時間長了難免會遇到和COM組件打交道的地方,用什么方式創建C# COM對象也成了我們必須面對的一個問題.據我所知道的創建C# COM對象的方法一共有以下幾種:

1.使用.NET包裝COM組件

這是最簡單的就是導入COM組件所在的DLL,讓IDE生成。NET一個IL包裝加到項目中,這樣原來COM里面所有實現了IDispatch,Dual的COM類型及其相關類型就可以直接在。NET程序里面使用,比如以前在2003時代,想要寫自己的基于IE的瀏覽器,就得手動加入與IWebBrowser2接口相關的DLL,這種方式是大家最常用的,也是最傻瓜化的,因此也沒什么可解釋的。

但是這種方式有個至命的缺點——不是所有的C# COM對象都能用這種方式導出。正如前面所說的,只有實現了IDispatch,Dual類型的接口才支持被導出,而且面對不同版本的COM或許會生成不一樣的導出DLL,比如說A機器上寫代碼時導入了一個Jet2.6版本的包裝DLL,代碼編譯了拿到B機器上去運行,但是B機器上的Jet版本是2.8的,就可能會出現運行時錯誤。

2.用反射動態創建

包括使用Type.GetTypeFromCLSID和Type.GetFromProgID兩種方法獲取COM對象的Type再創建.這種方式也好理解,就是說使用這兩個方法之前,必須得知道COM對象的GUID或ProgID,好在這也不是什么難事,一般我們要使一個COM對象,多多少少都了解一些這個COM對象的GUID或ProgID信息.用這種方獲取到了一個Type對象后,就可以用.NET里面通用的反射創建對象的方法來做了.

這里給出一個創建JetEngine 的COM對象的代碼實例:

  1. publicobjectGetActiveXObject(Guidclsid)  
  2. {  
  3. TypeTypet=Type.GetTypeFromCLSID(clsid);  
  4. if(t==null)returnnull;  
  5.  
  6. returnActivator.CreateInstance(t);  
  7. }  
  8.  
  9. Guidg=newGuid("DE88C160-FF2C-11D1-BB6F-00C04FAE22DA");//JetEngine  
  10. objectjet=GetActiveXObject(g); 

是不是覺得***調用GetActiveXObject(g)的地方和IE里面Javascript里面用new ActiveXOjbect創建COM對象的方法很相像?

3.聲明CoCreateInstance外部函數,用這個函數去創建相應的COM實例

M$在2005里面包裝的WebBrowser控件內部就是用這個函數去創建的, 使用這種方式創建COM,就跟在C++里面不什么兩樣了.有一點需要說明的是,一般我們在代碼中引入外部方法的時候,方法的參數和返回值的類型不一定是唯一的一種,只要在邏輯上相互能轉化,一般都可以使用.

比如說如下幾種聲明都是正確的:

  1. [return:MarshalAs(UnmanagedType.Interface)]  
  2. [DllImport("ole32.dll",ExactSpelling=true,PreserveSig=false)]  
  3. publicstaticexternobjectCoCreateInstance([In]refGuidclsid,  
  4. [MarshalAs(UnmanagedType.Interface)]objectpunkOuter,intcontext,[In]refGuidiid);  
  5.  
  6. [DllImport("ole32.dll",ExactSpelling=true,PreserveSig=false)]  
  7. publicstaticexternIntPtrCoCreateInstance([In]refGuidclsid,  
  8. IntPtrpunkOuter,intcontext,[In]refGuidiid);  
  9.  
  10. [DllImport("ole32.dll",ExactSpelling=true)]  
  11. publicstaticexternintCoCreateInstance([In]refGuidclsid,  
  12. IntPtrpunkOuter,intcontext,[In]refGuidiid,[Out]outIntPtrpVoid);  
  13.  
  14. [DllImport("ole32.dll",ExactSpelling=true)]  
  15. publicstaticexternintCoCreateInstance([In]refGuidclsid,  
  16. [MarshalAs(UnmanagedType.Interface)]objectpunkOuter,intcontext,  
  17. [In]refGuidiid,[MarshalAs(UnmanagedType.Interface),Out]outobjectpVoid); 

甚至于當你有里面對應的接口類型的聲明的時候,完全可以把上面的object或IntPtr換成相應的接口類型,前提是你的接口類型的聲明一定要正確.讀者中用C++做過COM的一定對這種方式記憶猶新吧,只不過這里不再需要什么CoInitialize和CoUninitialize,.NET內部自己幫你搞定了.順便提一下,上面例子中的object與IntPtr聲明是相通的,我們可以用Marshal.GetObjectForIUnknown和Marshal.GetIUnknownForObject這兩個方法在object和IntPtr之間互轉,前題當然是這兩種方式所指向的都是C# COM對象才行.這種方式提供的傳入參數最多,創建C# COM對象也最靈活.

【編輯推薦】

  1. 簡單介紹C#預處理
  2. 學習C#無詞尾符號經驗談
  3. C#調用QuickTest自動化
  4. 詳解C#正規表達式
  5. C#字符串插入html標簽
責任編輯:佚名 來源: IT168
相關推薦

2009-08-10 13:40:46

創建C# COM對象

2009-08-21 17:45:40

C#調用COM對象

2009-08-03 11:32:49

C#調用COM對象

2009-09-18 19:09:41

C# COM組件

2009-07-03 10:33:07

C#創建COM組件

2009-09-24 14:59:38

C#編寫COM組件

2009-08-25 17:28:23

C#創建DataSet

2009-08-19 14:35:12

C++和C#相互調用C

2009-08-21 09:14:47

C# Excel CO

2009-09-02 16:43:55

C#調用Excel的C

2009-08-03 14:36:08

c#組件

2009-08-24 17:46:54

C#創建XML文檔

2009-08-20 11:03:34

Visual C#使用

2009-08-05 15:10:19

C#調用GoogleE

2009-09-02 14:18:08

C#聲明COM接口

2009-09-24 15:10:54

C#調用COM組件

2009-08-10 14:03:08

C# COM接口

2009-08-20 17:13:37

C# FileSyst

2009-08-28 16:50:25

C# PromptPo

2009-08-11 10:12:21

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩在线小视频 | 视频在线日韩 | 一区二区在线视频 | 精品一区二区视频 | 久久99精品国产自在现线小黄鸭 | 日韩在线中文字幕 | 一区二区三区四区视频 | 国产精品天堂 | 亚洲欧美日韩精品久久亚洲区 | 日韩二| 中文字幕一区二区三区四区五区 | 欧美一级免费看 | 国产精品明星裸体写真集 | 成人免费黄色片 | 热99| 国产亚洲精品久久久久久豆腐 | 国产成人精品免费视频大全最热 | 2018中文字幕第一页 | 久久久久久亚洲国产精品 | 激情久久网| 亚洲欧美一区二区三区国产精品 | 毛片免费看 | 天天搞天天操 | 成人欧美一区二区 | 美女福利视频一区 | 一级欧美日韩 | 久久天堂| 国产一区二区影院 | 精品久久久久久久久久久久久久 | 日韩在线不卡 | 毛片视频免费观看 | 日韩av大片免费看 | 波多野结衣一二三区 | 亚洲精品久久久久久国产精华液 | 久久中文字幕一区 | 久久成人18免费网站 | 一本在线| av一级在线观看 | 91高清在线视频 | 国产午夜精品视频 | 北条麻妃av一区二区三区 |