3

これらの DLL を使用するすべてのアプリケーションに (おそらく) 何百もの DLL を含める必要がないように、CoreLib.dll に含めたい複数の DLL (自分で管理するか管理しないか) があります。DLL への直接参照を使用して DLL を含めます。

そのため、作成中のアプリケーションの DLL 内で宣言されたクラスもインスタンス化したいと考えています。MyApp.exe プロジェクトに描かれていることをしたくてもできません。CoreLib には A、B、または C への参照はありません。

ここに画像の説明を入力

どうすればやりたいことを達成できますか?

編集 提案どおりにファサードパターンを使用しましたが、コンパイルエラーが発生しています。MyApp プロジェクトに A.dll を含める必要があると言っています。なんで?これは私が避けたかったことです。これを回避する方法はありますか?

ここに画像の説明を入力

4

3 に答える 3

2

私はこれが可能だとは思わない。CorLib に A、B、および C DLL への参照を追加しても、CorLib はこれらの DLL を参照するだけです (AssemblyRef メタデータ テーブルには、アセンブリごとに 1 つのレコードがあります)。これは、CorLib がアセンブリおよび参照されているアセンブリのすべての型を再定義するという意味ではありません。MyApp.exe では、A、B、および C アセンブリを参照する必要があります。

別の解決策は、CorLib で Facade クラスを定義し、呼び出しを A、B、および C DLL にリダイレクトすることです。MyApp.exe では、Facade クラスを使用します。

于 2012-10-10T18:44:30.247 に答える
1

ILMergeを使用して、アセンブリを 1 つにマージできます。

その後、そのアセンブリ内のすべてのクラスを好きなように使用できます。

以下は、複数のアセンブリ (dll) を 1 つのアセンブリ (dll) にマージする方法の例です: http://www.fishofprey.com/2011/01/ilmerge-to-combine-multiple-dlls.html

本質的にあなたはただする

ILMerge.exe /out:CoreLib.dll A.dll B.dll C.dll
于 2012-10-10T18:56:18.060 に答える
0

対応する EXE/DLL に実装を含めるために、ビルド時に EXE/DLL にマージされるものを含む LIB/OBJ ファイルと DLL (実際の実装を含むネイティブ管理された世界にあります) を混同していると思います。

基本的に 2 つのオプションがあります。

  • アプリケーションですべての DLL を実行します (特殊な要件がない限り、通常の方法を使用する必要があります)。メイン アプリケーションからアセンブリを直接参照してクラスを作成するか、必要に応じてクラスを作成する CoreLib アセンブリ内にある種のファクトリを作成することができます。後のケースでは、すべての A..C アセンブリへの参照を追加する必要はないかもしれませんが (クラスを直接使用するのではなく、いくつかの共有インターフェイス/基本クラスを介して)、それらを持ち歩く必要があります。
  • ある種のアセンブリを1つにマージします(つまり、@Alexが提案するILMerge)。この方法では、最初の方法よりも CLR をよく理解する必要があり、サード パーティのアセンブリが関係している場合は (ライセンスの問題で) 使用できない可能性があります。
于 2012-10-10T19:02:52.190 に答える