Com與.Net互操做

Com與.Net互操做

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

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

靜態調用ui

一、  編寫Com組件MyComponent.dllspa

二、  產生可訪問Com組件的包裝類:.net

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

三、  在.Net代碼中訪問對象

只要在項目添加Com包裝類,就能夠像訪問.Net的裝配件同樣訪問Com組件。string

 

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

注意:file

一、  若是引用Com組件的.Net項目爲結果爲強命名組件,這個時候要求Com組件的包裝類也必須爲強命名組件,因此這個時候必須手動進行第二步操做,而且在產生包裝類的時候設置snk文件名稱,具體操做方法爲:

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

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

動態調用

一、  編寫Com組件MyComponent.dll。

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

Type comType = Type.GetTypeFromCLSID( Guid ); 或

Type comType = Type.GetTypeFromProgID( string );

三、  生成Com組件類對象

object comObj = Activator.CreateInstance( comType ); 或

object comObj = comType.InvokeMember(null,

            BindingFlags.DeclaredOnly |

            BindingFlags.Public | BindingFlags.NonPublic |

            BindingFlags.Instance | BindingFlags.CreateInstance,

null, null, args );

四、  設置參數及其對應的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)。

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

object returnValue = comType.InvokeMember(

 「MethodName」,indingFlags.InvokeMethod,null , comObj ,args ,modifiers ,null );

          注意:

一、  調用Com組件方法的時候,不可以採用MethodInfo的方式進行調用,因爲沒有Com組件的源數據信息,不能經過Type.GetMethod等方法夠獲取與Com組件相關的任何特有類型信息。

二、  動態調用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

相關文章
相關標籤/搜索