2011-02-01 5 views
0

レベル:ConsoleApp.exeで定義されている特定のタイプを参照する任意のDLLで処理を実行できるコンソールアプリケーション(ConsoleApp.exeなど)を作成しようとしています。共通DLLを参照するアセンブリ間で参照型を渡すにはどうすればよいですか?

arbirary DLLによって参照されることが意図されたタイプ(ConsoleClassなど)を含むConsoleApp用のコンパニオンDLLが必要であると誤って判断しました。これを解消するには、私がもっと良い方法を知らないうちに、ConsoleAppソリューションに2つのプロジェクトがあります.1つはクラスライブラリ(Proving ConsoleApp.dll)です。もう1つはクラスライブラリプロジェクトを参照するコンソールアプリケーションです。

これで、ConsoleApp.dllを別のソリューション(例:OtherApp.dll)内の比較的無関係の別のプロジェクトにコピーし、参照して、ConsoleClassインスタンスをパラメータとして使用するメソッドを書き込むことができました。

ここで、このOtherApp.dllを任意に処理するために、ConsoleApp.exeがそのアセンブリを読み込み、そのアセンブリ内の適切なクラスをインスタンス化し、そのインスタンスに対して適切なメソッドを呼び出します。以下の関連行は、私がこれをやっている様子をうまく説明してくれます。

Assembly.LoadFrom(path_to_OtherApp_dll); 
... 
var x = (dynamic)Activator.CreateInstance(type_inside_OtherApp_dll); 
... 
var instance = new ConsoleClass(); 
x.some_method_call(instance); 

最終的にこれは失敗します。これは、2つのプロジェクト(ConsoleApp.exeとOtherApp.dll)がConsoleClassを定義するために同じDLLを参照しているにもかかわらず、ランタイムはそれらが異なるタイプであると考えているためです。

どのような考えですか?

+0

'(動的)Activator.CreateInstance(T)'は意味がありません。 '(T)Activator.CreateInstance(T)'( 'T:= type_inside_OtherApp_dll') – stakx

+0

実際に、私はあなたがインスタンス化している型を知っているので、 。 'x.some_method_call(INSTANCE)'でコンパイル時にエラーが発生した場合は、間違った型のオブジェクトを渡していることがわかります。 – stakx

+0

私は個人的に私が文字通りのクラス名を知らない型にキャストする方法を知らないので、私は動的なものとしてキャストします。私は型(type_inside_OtherApp_dll)を持っていますが、それはリフレクションを通して集められました(私が以前は言及しなかったもの)。 ConsoleAppはコンパイル時にOtherApp.dllを参照することができないため、文字通り自分のコードにtype_inside_OtherApp_dllとしてキャストできません。 –

答えて

0

はい、これはConsoleApp.dllが2回読み込まれるときに発生します。メインアプリでもう一度プラグインで、ローカルコピーを使用します。タイプのIDは、ロードされたアセンブリによって決定されます。

どうしたのかは分かりません。あなたの最初の武器はFuslogvw.exeで、すべてのバインドをログに記録します。まず、プラグインプロジェクトを医師にし、ConsoleApp.dllリファレンスのCopy LocalプロパティをFalseに設定して、余分なコピーが誤って使用されないようにします。

プラグインDLLをメインのアプリケーションビルドフォルダにコピーすることは、問題のない解決策です。Assembly.Load()でロードすることができます。または、<probing>要素を使用してCLRがそれらを見つけることを可能にする.configファイルを含むサブディレクトリ。

+0

これはまさに何が起きているのかです。 5ページの長い質問をしないようにするために、兄弟として見つかったすべてのDLLを盲目的に読み込んで、私のアプリケーションが持っている依存関係を満たすことができるという事実を除外しました。私は良い方法があると確信していますが。ありがとうございました! –

0

「ランタイムはそれらが異なるタイプであると考えていますか」とは何ですか?セットアップはエラーの例外を除いて終了しますか? x変数のメソッドは、それが認識できないもの、または何かを受け取りますか?

3
  1. パブリックインターフェイスを定義します。それを独自のinterface.dllに置きます。
  2. プラグインのreference interface.dllを参照してください。 plugin.dllのメインクラスがあなたのインターフェースを実装するようにします。
  3. exeのreference interface.dllを参照してください。
  4. Assembly.Load()またはAssembly.LoadFrom()を使用して、exeにプラグインを読み込みます。
  5. CreateInstance()を使用して、プラグインクラスのインスタンスを作成します。
  6. 作成したプラグインをインターフェイスの種類にキャストするだけです。

「ダイナミック」などの複雑なものは必要ありません。ただ簡単に、私が書いたようにステップバイステップで行くと、それは動作します。がんばろう。

+0

Passantの答えが私を悩ませましたが、ここで説明したように、実装を構造化します。概要をありがとうございました。非常に役立ちます! –

関連する問題