2010-01-28 73 views
5

我正在嘗試使用反射將System.__ComObject投射到接口類型。我一直在使用Convert.ChangeType(Object,Type)嘗試,但C#則拋出這個錯誤:在C#中通過反射投射系統.__ ComObject

System.InvalidCastException: Object must implement IConvertible.

那麼,有沒有投一般__ComObject使用反射到其正確的類型,所以我可以再通過反射調用它的方法任何可能的方式?是的,它必須通過一種不涉及提前告訴編譯器什麼是對象類型的方法來完成!

+0

「我試圖將System .__ ComObject強制轉換爲接口類型」 - 您能否解釋爲什麼? – 2010-01-28 02:46:59

+0

如果你不能在你的代碼中使用它,那麼稍後使用Reflection可以做到的機率很小。一個COM對象實現定義良好的接口類型,它們在一個類型庫中定義,您必須使用Tlbimp.exe導入 – 2010-01-28 05:10:38

+0

謝謝你們。我試圖轉換它,因爲我調用的方法返回一個對象。我從一個無類型的dlr語言中調用該方法,所以我想通過給它一個正確的類型來施放它,然後使用反射調用它。如果對象仍然是__ComObject,我不能使用object.getType。當然,我可以每次指定類型或存儲類型,但這不是問題的關鍵點:) – Josh 2010-01-28 13:56:04

回答

6

一般來說,沒有。

_ComObject需要實現.Net運行時知道的接口。這可能是您從QueryInterfaceIDispatch獲得的界面。

如果是前者,則必須知道界面是什麼,然後必須使用界面上的ComImportAttribute來描述.Net的界面。

如果COM對象實現IDispatch,則可以動態調用其上的成員。在.Net 4.0及以上版本中,這可以通過使用dynamic關鍵字輕鬆完成。如果您使用的是早期版本的.Net,則可以調用InvokeMember(),返回GetType()返回的類型,或者轉換爲IReflect,然後使用該接口調用方法。

最好的情況是,如果通過COM庫運行tlbimp.exe或通過COM庫創建主互操作程序集(PIA),通常會從COM庫作者獲得COM對象的運行時可調用包裝程序(RCW) 。

+0

感謝這是我需要知道的。 – Josh 2010-01-28 14:52:00