2012-11-13 9 views
5

私のコードでは、私はインターフェイスを持っています - InterfaceNameとその実装はInterfaceImplと呼ばれると言うことができます。今私は、動的に次のコードを使用してInterfaceImplを取得しようとすると:私は間違っているかもしれないものにキャストすることができませんSystem.Runtime.Remoting.ObjectHandle

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

任意の提案、次のエラーを取得

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

を?

+1

Unwrap()メソッドを使用します。 –

答えて

22

If you read the documentation about the method you are calling、それは

新しく作成されたインスタンスにアクセスするためにアンラップされなければならないハンドルを返します。

ObjectHandleのドキュメントを見ると、あなたは単にあなたが作成しようとしているタイプのインスタンスを取得するために、Unwrap()を呼び出します。

あなたの本当の問題は...だと思います。なぜですか?

このメソッドは別のAppDomainで呼び出されるように設計されており、ハンドルは呼び出されたAppDomainに戻されます。インスタンスのプロキシは「ラップされていません」。

何ですか?それは理由を説明していない?

AppDomainバリアを横切るのは2種類だけです。直列化可能な型(コピーが作成される)、およびMarshalByRefObject(そのうちプロキシが作成され、渡される型)を含む型。 ObjectHandleMarshalByRefObjectを拡張するので、そのバリアを越えることができますが、表現しているタイプは、MBRO またはをシリアル化可能にすることはできません。この方法では、何があってもバリアを越えてそのタイプのインスタンスを取得できるようになります。

したがって、型のインスタンスを作成しようとしているだけの場合は、CreateInstanceの別のオーバーロードを確認することができます。または、結果をアンラッピングするだけです。

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

ありがとうございました。 –

+2

同じジョブを1ステップで実行する[CreateInstanceAndUnwrap](http://msdn.microsoft.com/en-us/library/3c4f1xde.aspx)を使用することもできます(デフォルトコンストラクタが存在する場合) – Askolein

関連する問題