2011-01-26 25 views
0

私はプラグインアーキテクチャを利用したプログラムを持っています。最初のフォームがロードされると、現在のディレクトリをスキャンし、各dllを照会し、ユーザーに表示されるいくつかの基本データを取得します。C#DLLアクセスの制御

プログラムを使用している間、ソフトウェアはdllに何らかの作業を依頼することがよくあります。

私の質問は、プログラムが最初にdllファイルをチェックするときに、後で使用するために各dllオブジェクトへの参照を保持すべきかどうか、またはdllファイルを毎回照会して、

これが最初の場合は、共通のインターフェイスから派生した不確定な数のオブジェクトのリストを保持し、必要なときに参照するオブジェクトを知る最良の方法は何ですか?

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

+0

必要に応じて保存し、必要なときに作成するといいでしょう:)。 –

答えて

2

辞書を使用して

をあなただけ

List<IYourCommonInterface> pluginDlls

を作成することができます最初のものを使用して、ちょうど

pluginDlls.Add(dllReference);

編集代替方法、このことに注意してくださいあなたに何かのあなたがdllをidに使うことができる辞書のID。

Dictionary<SomeIDField, IYourCommonInterface> pluginDlls

pluginDlls.Add(dllRefrence);

+0

(1+)おそらく辞書 ...各リソースの識別/アクセスの簡単な手段を持っているかもしれません。 – used2could

+0

@ used2could良い提案 – msarchet

0

あなたはDLLを見つけ、ロードのトラブルを経てきた場合は、通常、あなたはそれらを周りに保つことをお勧めします。これは、DLLが使用するリソースの数とDLLがどのように使用されているかによって大きく異なります。

ここでLoadAssemblyを使用しているとします。何らかの種類のマップを使用してロードしたアセンブリへの参照を保存するだけで済みます。またはあなたが繰り返すリスト。

おそらくもっと詳しくお伝えいただければ、より良いお手伝いをすることができます。

+0

効果的に、プログラムがロードされると、プログラムはdllを照会して表示しますその識別子/名前をユーザに通知する。ユーザーは1つまたはいくつかの外部データを選択することができ、dllはそのデータで何をすべきかを知ることができます。 –

+0

ある時点で、DLLに定義されているクラスのインスタンスを作成する必要がありますが、メインアプリケーションで定義した共通のプラグインインタフェースが実装されています。これを行うにはさまざまな方法があります。たとえば、ロード時に、DLLはメインアプリケーションにある種のレジストリで登録される可能性があります。または、リフレクションを使用して特定のインスタンスのクラス名を検索し、DLLからその名前を派生させることもできます。いくつかの例については、http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/c3da5226-fc87-4fff-be60-4cc5af4d6c07を参照してください。 –

+0

プラグインクラスを特定するためのより慣れ親しんだ解決策は、インターフェースと属性を組み合わせることだと思います。アセンブリを読み込んだ後、その中のすべての型を繰り返し、その上に属性を持ち、インターフェイスを直接的または間接的に実装する型を選択します。例として、コマンドレットがPowerShellによって識別される方法を参照してください。 –

1

ほとんどのアプリは負荷のチェックを行います。

私はインターフェイスのリストを保存しません。それらを格納すると、アセンブリが消えたり、何らかの方法で更新されたりする可能性があります。とにかく、それらを「リフレッシュ」する必要があります。

1

Assembly.Load()、Assembly.LoadFrom()、Assembly.LoadFile()などを使用してアセンブリを読み込み、System.Reflection.Assemblyのインスタンスを取得すると、アセンブリは次のようになります。ロードされる。 MSDN on the subjectを引用すると:

を...それは...可能、実行時に現在のアプリケーションドメイン に特定のアセンブリをロードするために... はすべてを をアンロードすることなく、個々のアセンブリをアンロードする方法はありませんそれを含むアプリケーションドメイン。アセンブリが スコープ外に出ても、実際のアセンブリファイルは、それを含むすべてのアプリケーションドメイン がアンロードされるまで、ロードされたままです。[重点鉱山]

あなたは、あなたが実際にそれらを必要とするような時間まで、DLLをアンロードしたいのであれば、あなたは新しいアプリケーションドメインを作成し、それをアンロードする必要があるとしています。簡単にロードしてやりました。もしあなたが好きなら、assemply参照を保持することができますが、Assembly.Load()をもう一度呼び出すと、実際にはアセンブリがロードされません。以前ロードされたアセンブリへの参照を取得します。