2012-11-13 78 views
1

我試圖做一種代理,我想知道COM方法和屬性是靜態的還是動態的。換句話說,.NET是否調用com對象並告訴它要執行哪個方法,然後讓com對象假裝它已經執行了它(DynamicObject允許你在.NET中執行的方式,只是在沒有做任何事情的情況下爲TryInvokeMember返回true ),還是.NET實際去直接調用COM方法(靜態)?COM對象是動態還是靜態的

+2

你能否澄清一下「com對象假裝它已經執行了它(動態)」? –

+2

@Alexei:他問的是,方法綁定是由編譯器完成的(靜態綁定)還是對象本身解析綁定 - 就像[DynamicObject](http://msdn.microsoft.com/zh-cn/ us/library/system.dynamic.dynamicobject.aspx)/ ['IDynamicMetaObjectProvider'](http://msdn.microsoft.com/en-us/library/system.dynamic.idynamicmetaobjectprovider.aspx)它可以假裝有任何方法。 –

回答

2

這聽起來像你問之間的區別早期綁定(靜態)和後期綁定(動態)。 C#同時支持。

早期綁定需要使用類似TlbImp.exe這樣的工具來創建Interop程序集,以便爲直接調用接口方法的COM對象生成代理。

要使用後期綁定,可以使用反射(雜亂)或dynamic關鍵字在運行時綁定方法調用。

但是,COM對象不會「僞裝」它執行了一個你要求的方法 - 如果該方法不存在,你將得到一個運行時異常。

+0

'Activator.CreateInstance'會遲到嗎? COM對象是否也可以僞裝該方法?或者.NET以某種方式使它做什麼? –

+0

如果你通過它們的字符串名稱調用方法,那麼是的,那將是遲到的綁定。 COM對象可以忽略對缺少方法的調用嗎?沒有一個在C#中創建。你必須在C++中手動實現IDispatch,這會很痛苦。你想達到什麼目的? –

+0

我想弄清楚如何製作一個DynamicObject COM對象,但現在我可以告訴我在吠叫錯誤的樹。我對COM也不是很瞭解,所以我也想弄明白。我會問另一個問題。 –

相關問題