2013-07-16 117 views
2

我正在編寫使用其他應用程序的程序。
可以說應用程序id是TheCompany.TheProg在Visual Studio C#中使用COM +對象而不使用Interop-DLL

起來,直到如今,我用「添加引用/ COM」,並選擇TheProg IIb型

,但它是由3ED方提到的不支持創建Interop DLL的供應商,並且可能會因版本升級而導致一些界面更改。

我的問題是:我該如何參考TheCompany.TheProg沒有創建Interop DLL的COM +對象?

我知道我可以使用

Type theProgType = Type.GetTypeFromProgID("TheCompany.TheProg"); 
dynamic myObject = Activator.CreateInstance(theProgType); 
dynamic version = myObject.AMethod(); 

但: 1.我需要轉換的一切動態需要.NET FW V4!
除非我想使用theProgType.InvokeMethod():)
2.我沒有智能感知。

非常感謝

+0

我知道這是舊的,但如果你仍然在尋找答案,也許我會爲你工作。 – Noseratio

回答

1

不能幫助自己給一個遲到的回答這個問題,因爲我剛剛處理了類似的事情。

基本上,你可以自己定義其接口的子集,通過後期綁定才能使用,方法如下:

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] // late binding only 
[Guid("00020400-0000-0000-C000-000000000046")] // IDispatch's GUID 
interface IMyLateBindingAdaptor 
{ 
    // a subset of IWebBrowser2 [http://msdn.microsoft.com/en-us/library/aa752127(v=vs.85).aspx] 
    string LocationURL { get; } 
    void Navigate(string url, ref object flags, ref object TargetFrameName, ref object PostData, ref object Headers); 
} 

確保定義屬性的名稱和簽名和方法,從符合規格您供應商。

使用它:

var adaptor = this.webBrowser1.ActiveXInstance as IMyLateBindingAdaptor; 
if (null == adaptor) 
    throw new ApplicationException("No late binding."); 
object missing = Type.Missing; // VT_EMPTY 
adaptor.Navigate("http://www.example.com", ref missing, ref missing, ref missing, ref missing); 
MessageBox.Show(adaptor.LocationURL); 

在我看來,它比動態更好,因爲它給你編譯時類型安全(在某種程度上)和智能感知。

+0

1.與使用TLBImp工具創建Interop.Dll不完全相同嗎? –

+1

不。與TLBImp不同的是,使用這種方法,除了名稱本身以外,**沒有顯式綁定**到供應商的任何API。沒有數字DISPID,所以C#會在運行時需要解析時調用[IDispatch :: GetIDsOfNames](http://msdn.microsoft.com/en-us/library/ms221306(v = vs.85).aspx)一個新的名字。您的供應商可能會更改方法,GUID,DISPID的順序或添加新方法。但只要他們保持方法名稱和參數與現有方法相同,您的代碼就可以在不重新編譯的情況下工作。您只需放入新的COM服務器DLL即可。 – Noseratio

+0

好吧,很高興知道,我的TLB有超過100個類,有50個公共成員,有沒有一個工具(類似於TLBImp)會自動構造這個代碼? –