.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