Com與.Net互操作

來源:互聯網
上載者:User

標籤:code   c   int   a   get   strong   

Com與.Net互操作

  .Net調用Com組件主要分為兩類:靜態調用及動態調用。所謂靜態調用:指通過tlbimp.exe命名產生Com組件在.Net環境下的封裝類,然後通過這個封裝類來訪問Com組件。所謂動態調用:是指不通過Com組件的封裝類來進行Com組件調用,而是在遠行時通過反射來進行Com組件調用。

下面將分別詳細的討論這兩種實現方法:

靜態調用

1、  編寫Com組件MyComponent.dll

2、  產生可訪問Com組件的封裝類:

tlbimp /out:Interop.MyComponent.dll MyComponent.dll

3、  在.Net代碼中訪問

只要在項目添加Com封裝類,就可以像訪問.Net的裝配件一樣訪問Com組件。

 

當然上面的三個步驟也可以在VS中直接添加對Com組件的引用,讓VS自動完成第二步。

注意:

1、  如果引用Com組件的.Net項目為結果為強命名組件,這個時候要求Com組件的封裝類也必須為強命名組件,所以這個時候必須手動進行第二步操作,並且在產生封裝類的時候設定snk檔案名稱,具體操作方法為:

tblimp /keyfile:filename.snk /out:Interop.MyComponent.dll MyComponent.dll

2、  要想有更多的設定請參考tlbimp的使用方法。

動態調用

1、  編寫Com組件MyComponent.dll。

2、  在.Net程式中產生要被調用的Com組件類的Type:

Type comType = Type.GetTypeFromCLSID( Guid ); 或

Type comType = Type.GetTypeFromProgID( string );

3、  產生Com組件類對象

object comObj = Activator.CreateInstance( comType ); 或

object comObj = comType.InvokeMember(null,

            BindingFlags.DeclaredOnly |

            BindingFlags.Public | BindingFlags.NonPublic |

            BindingFlags.Instance | BindingFlags.CreateInstance,

null, null, args );

4、  設定參數及其對應的ByRef屬性。

object[] args = new object[]{arg1, arg2 , …,argn};

ParameterModifier[] modifiers = new ParameterModifier[1];

modifiers[0] = new ParameterModifier( argNumCount );

//設定參數是否為ByRef

modifiers[0][0] = true;//表示該參數是ByRef(InOut/Out)

modifiers[0][n] = false;//表示該參數是ByValue(In)。

 5、  調用Com組件方法或者屬性。

object returnValue = comType.InvokeMember(

 “MethodName”,indingFlags.InvokeMethod,null , comObj ,args ,modifiers ,null );

          注意:

1、  調用Com組件方法的時候,不能夠採用MethodInfo的方式進行調用,由於沒有Com組件的來源資料資訊,不能通過Type.GetMethod等方法夠擷取與Com組件相關的任何特有類型資訊。

2、  動態調用Com組件方法中,如果需要參數回傳值,則必須將該參數對應的ParameterModifier表示設定為True,即使該參數類型為傳址類型。(在.net中如果參數為傳址類類型,那麼參數預設行為是ByRef的)。

c#建立組件

a)         工程屬性→應用程式→程式集資訊→勾選“使程式集COM可見”

b)         工程屬性→產生→勾選“為COM互操作註冊”

c)         不能使用靜態類、靜態方法

d)         參數僅使用基本類型,如string、int

註冊裝配件 RegAsm /codebase MyService.dll

注意:/codebase是指設定註冊表中的基本代碼,也就是記錄下dll的路徑,供ccw在Com用戶端在任何位置都可以找到該dll,如果沒有/codebase屬性,則預設為dll在Com用戶端執行程式的目前的目錄下面。

 

工具用法:

將COM對象轉換為.NET程式集

//TlbImp.exe /out:Interop.XX.DLL /namespace:Interop.XX

將普通dll匯出為TXT檔案

//dumpbin.exe /exports xx.dll >file.txt

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.