標籤: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