10

私のコードにはインターフェースがあります-と呼ばれInterfaceName、その実装はと呼ばれInterfaceImplます。InterfaceImpl次のコードを使用して動的に取得しようとすると、次のようになります。

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'.

何がうまくいかないかについての提案はありますか?

4

1 に答える 1

31

呼び出しているメソッドに関するドキュメントを読むと、 が返されます。

新しく作成されたインスタンスにアクセスするためにラップを解除する必要があるハンドル。

のドキュメントを見ると、作成しようとしている型のインスタンスを取得するためにUnwrap()ObjectHandleを呼び出すだけです。

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

このメソッドは、別の で呼び出されるように設計されており、インスタンスへのプロキシが「ラップ解除」されて AppDomainいる呼び出し側にハンドルが返されます。AppDomain

何?それは理由を説明していませんか?

AppDomainバリアを越えることができるのは 2 種類だけです。シリアル化可能な型 (コピーが作成される)、およびMarshalByRefObjectを拡張する型(プロキシが作成されて渡される)。 ObjectHandleextendsMarshalByRefObjectであるため、そのバリアを越えることができますが、AppDomainそれらが表す型は MBRO を拡張したり、シリアライズ可能ではない場合があります。このメソッドにより、バリアを越えてその型のインスタンスを取得できることが保証されます。

そのため、型をインスタンス化するだけの場合は、CreateInstance の別のオーバーロードを確認することをお勧めします。または、結果をアンラップします。

var obj = Activator.CreateInstance("A","A.B.C") as ObjectHandle;
InterfaceName in = (InterfaceName)obj.Unwrap(); 
于 2012-11-13T18:28:37.247 に答える