2012-11-13 142 views
5

在我的代碼中,我有一個接口 - 可以說它叫做InterfaceName,它的實現叫做InterfaceImpl。現在,當我嘗試動態地使用下面的代碼來獲得InterfaceImpl無法投射System.Runtime.Remoting.ObjectHandle

object obj = Activator.CreateInstance("ProjectName","ProjectName.Folder.InterfaceImpl"); 
InterfaceName in = (InterfaceName)obj; //Error pops up here 

我收到以下錯誤

Unable to cast object of type 'System.Runtime.Remoting.ObjectHandle' to type 'ProjectName.Folder.InterfaceName'. 

上可能什麼錯什麼建議?

+1

使用Unwrap()方法。 –

回答

22

If you read the documentation about the method you are calling,它返回

必須解開來訪問新創建的實例的句柄。在ObjectHandle文檔

看,你只需撥打Unwrap()爲了得到你要創建類型的實例。

所以,我想你真正的問題是......爲什麼?

此方法被設計爲在另一個AppDomain中被調用,並且句柄返回到調用AppDomain,其中實例的代理是「解包」的。

什麼?這並不能解釋爲什麼?

只有兩種類型可以通過AppDomain屏障。可序列化的類型(其中創建了副本)以及延伸MarshalByRefObject(其中代理已創建並通過)的類型。 ObjectHandle延伸MarshalByRefObject,因此可以跨越該障礙,而它們所代表的類型可能不會延伸MBRO 可序列化。無論如何,這種方法可以確保您可以跨越屏障獲取該類型的實例。

所以,如果你只是試圖實例化一個類型,你可能想看看CreateInstance的一個不同的重載。或者只是打開結果。

var obj = Activator.CreateInstance("A","A.B.C") as ObjectHandle; 
InterfaceName in = (InterfaceName)obj.Unwrap(); 
+0

感謝您的訣竅 –

+2

您還可以使用[CreateInstanceAndUnwrap](http://msdn.microsoft.com/zh-cn/library/3c4f1xde.aspx)在一個步驟中執行同一作業(如果存在缺省構造函數) – Askolein