2010-04-13 97 views
7

我有一個應用程序使用通過接口管理的插件,然後動態加載插件類並將它們投射到接口以使用它們。使用反射投射錯誤

我有以下代碼行,假設IPlugin是我的界面。

IPlugin _plugin = (IPlugin)Activator.CreateInstance(oInfo.Assembly, oInfo.FullyQualifiedName) 

這應該很簡單,創建實例並將其轉換爲接口。我知道程序集和完全限定的名稱值是正確的,但我得到以下例外。

異常= System.InvalidCastException:無法類型的 鑄造對象 「System.Runtime.Remoting.ObjectHandle」 鍵入 「MyNamespace.Components.Integration.IPlugin」。 在 MyNamespace.Components.Integration.PluginProxy..ctor(的Int32 實例Id)

任何想法可能導致此?

回答

12

的異常指示你得到一個ObjectHandle,這表明你的對象被編,必須解開。

請嘗試以下

ObjectHandle marshaled_plugin = (ObjectHandle)Activator.CreateInstance(oInfo.Assembly, Info.FullyQualifiedName); 
IPlugin plugin = (IPlugin)marshaled_plugin.Unwrap(); 
7

正如您在documentation中看到的那樣,此超載會返回包含新實例的ObjectHandle object

ObjectHandle不能直接轉換到您的界面。
相反,你需要調用Unwrap method,就像這樣:

IPlugin _plugin = (IPlugin)Activator.CreateInstance(...).Unwrap(); 
+0

他不會需要轉換爲'ObjectHandle'第一,以'展開()'? – Jay 2010-04-13 21:29:15

+0

@Jay:不;它被聲明爲返回ObjectHandle。閱讀文檔。 – SLaks 2010-04-13 21:55:28