2009-06-01 8 views
3

私はサブディレクトリから起動時にプラグインをロードするアプリケーションに取り組んでいますが、現在はリフレクションを使って各アセンブリのタイプを繰り返し処理し、IPluginModuleインタフェース。プラグインのアーキテクチャにおけるリフレクションと属性

Reflectionにはパフォーマンスヒットが含まれていますし、しばらくしてからいくつかのプラグインがあると思いますので、アセンブリレベルで適用されたカスタム属性を定義すると便利でしょうか。タイプ(おそらく、IPluginModuleの1つの実装者を含むアセンブリ内の約12種類のタイプ)。

属性が存在する場合、必要な型またはインスタンスを返すメソッドを提供することができ、その型を反復処理するのはフォールバックのメカニズムにすぎません。タイプ情報を設定ファイルに格納することはオプションではありません。

パフォーマンスが向上しますか、実際にアセンブリからストレージをロードするのにかかる時間に比べて問題はありませんか?また、この使用法は属性にはまったく適していますか?

+0

パフォーマンスヒット?私はJavaからではなく、C#からの期待 - 私はあなたがそれを測定した場合、どのように知って興味があると思います。 –

答えて

7

私は質問であなたの質問に答えます:なぜこれについて心配ですか? 後日、いくつかのプラグインがあるかもしれないので

あなたは1時間の操作で可能性パフォーマンスヒットを心配しています。

アプリケーションの起動時間がユーザにとって長すぎる場合を除いて、私はそれについて考えるのに時間を浪費することはありません。アプリケーションを改善するためにはるかに優れた方法があります。

+0

私はまず設定の提案を試みましたが、Activator/Assembly.CreateInstanceを使用しなければならなかったので、ほとんど違いがないことがわかりました。 私はカスタムアセンブリレベルの属性を使用して型名を取得しています。あなたが推測したように、起動時間を改善できる他の領域がすでに見つかりました。 – Botz3000

+0

あなたはループを逃してクラスがあなたのインターフェースを実装しているかどうかを確認する設定をしています。 – CSharpAtl

+0

すべてのタイプの多数のアセンブリのリストをロードして取得することは、パフォーマンスとメモリの問題になります。すべての型を取得することで、CLRが通常は負荷を軽減するメモリ内に多くの型のインフラストラクチャがロードされます。それは考慮に入れるべきことです。 –

0

アトリビュートでタグ付けされたすべてのクラスをアセンブリに要求するとリフレクションも使用されると思っていました。次に、メタデータ、インターフェイス実装、または属性マーキングの検索が高速になりますか?

+0

私は、メタデータを通して見ては高速であることをどこかで読んだと思います。しかし実際には、私たちはミリ秒単位でしか話していません、私は確信しています。 – IAbstract

7

また、すべてのクラスをループするのではなく、正確なクラスを知るように、プラグ可能なタイプを構成に含めることもできます。このオプションにはいくつかの設定ユーティリティが必要ですが、ループするクラスの数に応じてパフォーマンスが向上する可能性があります。

+0

+1 - これはまさに私のやり方です。構成内のアプリケーションにプラグインを登録します。私はカスタムプラグインを実際にロードするためにカスタムセクションハンドラを使います。 – tvanfosson

+0

私もアセンブリを最初に追加するときに反復します。私は後で必要とする詳細を抽出します(加えてユーザーフレンドリーな情報もあります)。このデータは、後で使用するためにシリアライズされます(Activator経由)。また、ユーザーは起動時に「自動インスタンス化」プラグインを使用することもできます。 – IAbstract

3

Microsoftの2つの.netプラグインフレームワークであるManaged AddIn Framework(MAF)とManaged Extensibility Framework(MEF)はどちらも、属性やリフレクションを使用してプラグインを検出できます。だからMicrosoftは属性が適切だと感じているようだ。

ただし、パフォーマンスの違いはわかりません。

1

良い解決策は、プラグインに関するすべての情報をキャッシュすることです。アプリケーションが初めて起動されると、プラグインDLLのフルスキャンが実行され、ファイル内のタイプのリストが保存されます。次回アプリケーションが起動すると、ファイルから情報をロードします。これは、すべてのdllを再度スキャンするよりもはるかに高速です。アプリケーションは、各dllのタイムスタンプも保存することができるので、dllの変更を検出した場合は、dllを再スキャンしてキャッシュを更新することができます。

これは、基本的には、Mono.Addins frameworkが続く方法です。

+0

ありがとう、良いアイデア。 – Botz3000

関連する問題