どのように適切なキャストで作成したオブジェクトを通じて反射

StackOverflow https://stackoverflow.com/questions/31567

  •  09-06-2019
  •  | 
  •  

質問

ようにしている巻頭周辺の反射が決まっていますので追加プラグイン機能をプログラムしているところ。のわかりやすいコンセプトが指で汚れや、コードを書くように行った経路をシンプルなインタフェース図書館の蔵書、IPluginとIHostタプラグインの実施に図書館を実装するクラスIPlugin、簡単なコンソールのプロジェクトinstantiatesのIHost実装クラスは単純にプラグインのオブジェクト.

反射したかったのに対して繰り返し処理を実行するの種内に収まるように私のプラグイン実装をdllとスのインスタンスを作成。このsucessfullyインスタンスを生成クラスこのコードがないキャストは、作成されたオブジェクトのインタフェース。

またこのコードからなかったキャストオブジェクトとしてできたので、良かったです。ご用意いたしております。を通じてのプロセス、デバッガとの適切なコンストラクタが行われようとしていました。Quickwatchingオブジェクトoのキーに対応していただいたこの分野の特性と予見の実装クラスです。

loop through assemblies
  loop through types in assembly
    // Filter out unwanted types
    if (!type.IsClass || type.IsNotPublic || type.IsAbstract )
      continue;
    // This successfully created the right object
    object o = Activator.CreateInstance(type);
    // This threw an Invalid Cast Exception or returned null for an "as" cast
    // even though the object implemented IPlugin      
    IPlugin i = (IPlugin) o;

また、コードの仕事です。

using System.Runtime.Remoting;
ObjectHandle oh = Activator.CreateInstance(assembly.FullName, type.FullName);
// This worked as I intended
IPlugin i = (IPlugin) oh.Unwrap();
i.DoStuff();

ここで私の質問:

  1. 活性化剤です。CreateInstance(タイプt)オブジェクトを返します、こんなにキャストオブジェクトのインタフェースのオブジェクトを実装します。なぜですか?
  2. すべての異なる過負荷のCreateInstance()?
  3. その反射の関連、さらにお得な価格での?
  4. があるのも重要な部分に反映しているところだけでなく?
役に立ちましたか?

解決

私の顔をここからコードをないがして定義IPluginスができない場合はキャストにホストアプリケーションはというIPluginインターフェースをホスト組立、そして同時にプラグイン。これは動作しません.

最も簡単なことはこの作品はIPluginイマーとして公開スタート組み立てとしてプラグインの組立 参照はホストアプリケーション組立, おり、アセンブリにアクセス にも同じスーパーインターフェイス.

他のヒント

う~ん...ご利用の場合ます。LoadFromを組み立てに変更してみてくださいいます。LoadFileです。

試験

下からもアクセスできます。 http://www.eggheadcafe.com/community/aspnet/2/10036776/solution-found.aspx

@lubos hasko

すぱでは、まったと言われています。Myオリジナルデザインによって異なる三つのセンブリーのホストとプラグイン実装を参照しーます。

また別の溶液にホストの実施および界面の組み立て、プラグインを実施。そのソリューションでは、コードの最初のブロックとして期待される。

だから南北朝時代にかけて少を考えいをしてほしいほしいしてほしいなかなか理解がなぜ二つのアセンブリを参照の共通組み立てない同種の共通します。

どうしてそうなっちゃうんですかうのでこの出自管理システムへの信認が揺らぎに!

私は3異なるC#プロジェクト

  • A-プラグインインターフェイスプロジェクト
  • B-ホストexeプロジェクト->参照
  • C-プラグインの実施プロジェクト->参照

また、鋳造誤差までの名称マー projに合わせ名前空間のどの見キャストです。

E.g.

IPluginModule pluginModule = (IPluginModule)Activator.CreateInstance(curType);

しなので組み立てることIPluginModuleインターフェースで定義されたという共通のタイプでした鋳造した'Blah.Plugins.一般的です。IPluginModule'しています。

私の名前のインターフェース用のprojする'Blah.Plugins.共'このキャストしました。

この説明を入れてもらった。のコードの..

では、その場合、過負荷がかかり、boolean:

Activator.CreateInstance(type, true);

また、最初の例にはしばらく時間がかかる場合oがnullの場合とない場合は印刷して下さい。GetType().名前に見つのプラットフォームに対応

@Haacked

また、擬似コードシンプルです。foreachのアプスペースとブレース.明らかになったのです。

o。GetType().FullNameを返しますPlugins.掛ける想されるオブジェクトです。Plugins.掛け算を実装しIPlugin.ご用意いたしております。過程では、デバッガかなりの数の時までといたします。圏んでキャストで見るコンストラクタ火までgrumpyに散らかっていたとします。に戻ってきたので、この晩で作り、結果を出したことがいまだにわからない理由にキャストに失敗した最初のコードブロックです。第二コードブロック作品でじめました。

へのリンクegghead上がメインの解決の問題を解決する。LoadFileわれるのです。LoadFrom()

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top