バックグラウンド:
MEFを使用して、.NET 4.0でC#を使用するWinFormアプリケーションにプラグインアーキテクチャを提供することに興味がありますが、いくつかの点について明確ではありません。
まず、私はまだC#でDLLを構築する作業をまったく行っていません。また、DLLアセンブリの概念と、DLLが通常どのようにメモリにロードされるか(つまり、必要に応じて一度にまたは分割して)について少し曖昧です。
意図:
プログラムはマシンハードウェア制御フレームワークであり、基本的なツールバーやメニューなどを備えた汎用環境であるプライマリWinForm GUIで構成されますが、バルクGUIコンテンツは含まれません。(考えてみてください:MDI親ですが、実際にはそうではありません)。
プラグインは、特定のマシンのすべてのコントロールを提供します。多くの可能なプラグインのそれぞれには、潜在的に30〜50の大きなUserControlが含まれ、それぞれに数十のWinFormコントロールと、さまざまなマシンコントロールパネルを構成する大量のサポートコードが組み込まれています。
つまり、メインプログラムは軽量の一般的なフレームワークであり、プラグインには、多くのアイコン、画像、その他のリソースなど、メインプログラムのユーザーインターフェイスに表示されるGUIコントロールと機能の大部分が含まれています。これにより、プラグインDLLが非常に大きくなる可能性があります。
目標は、ユーザーがメニューからプラグインを選択できるようにすることです。次に、選択時にプラグインをロードして実行します。これにより、ほとんど空のメインGUIにパネル、メニュー、およびツールボックスが大量に表示されます。
これを行うには、最初に各プラグインからメタデータを抽出して、プログラムの初期メニューにデータを入力する必要があります。これには、プラグインのタイトル、説明、アイコン、バージョン番号、およびその他の情報が含まれます。
質問は次のとおりです。
MEFを使用して、プラグインフォルダーに格納されている多数の大きなDLLのそれぞれからメタデータを読み取ろうとすると、メタデータ値にアクセスする前にDLL全体がメモリにコピーされますか?
もしそうなら、各DLLファイルを開き、メタデータをメモリに読み込んで初期メニューを作成する方法はありますか?その後、選択した完全なDLLをMEFからロードしますか?
MEFを介してプラグインを読み取るための一般的なDirectoryCatalogおよびAggregateCatalogテンプレートは、検出されたすべてのDLLをメモリにコピーし、カタログコレクションに格納すると想定しています。
DLLには1つの連続したコードブロック(アセンブリ)が含まれていますか、それとも必要に応じて個別にインデックスが作成されてメモリにコピーされる複数の個別のブロック(複数のアセンブリ)が含まれていますか?
私はおそらく基本を理解しておらず、おそらく紛らわしい用語です。MEF、DLL、およびアセンブリ全般のロード動作についての洞察をいただければ幸いです。ありがとう !