6

複数の .cs ファイルで物理的にコード化された単一のファイル アセンブリと、複数の .NetModules を持つマルチ ファイル アセンブリの違いと利点は何ですか??

私の教授は、これらのアセンブリがロードされたとき、またはジッティング中に違いがわかる可能性があると言います。複数ファイル アセンブリのすべての .Netmodules が一度にロードされるわけではありません。しかし、彼でさえ確信が持てません。誰でも私を明確にすることができますか?

4

1 に答える 1

10

という名前の 2 つの .cs ファイルが
RUT.csあり、これにはめったに使用されない型
FUT.csが含まれており、これには頻繁に使用される型が含まれています
csc /t:module RUT.cs
この行により、C# コンパイラは RUT.netmodule ファイルを作成します。このファイルは標準の DLL PE ファイルですが、CLR はそれ自体を読み込むことができません。

次に、頻繁に使用される型を独自のモジュールにコンパイルしましょう。型は頻繁に使用されるため、このモジュールをアセンブリのマニフェストのキーパーにします。実際、このモジュールはアセンブリ全体を表すため、出力ファイルの名前を FUT.dll ではなく、JeffTypes.dll に変更します。

csc /out:JeffTypes.dll /t:library /addmodule:RUT.netmodule FUT.cs

この行は、FUT.cs ファイルをコンパイルして JeffTypes.dll ファイルを生成するように C# コンパイラに指示します。/t:library が指定されているため、マニフェスト メタデータ テーブルを含む DLL PE ファイルが JeffTypes.dll ファイルに出力されます。/addmodule:RUT.netmodule スイッチは、RUT.netmodule がアセンブリの一部と見なされるファイルであることをコンパイラに伝えます。具体的には、/addmodule スイッチは、ファイルを FileDef マニフェスト メタデータ テーブルに追加し、RUT.netmodule のパブリックにエクスポートされた型を ExportedTypesDef マニフェスト メタデータ テーブルに追加するようコンパイラに指示します。 ここに画像の説明を入力

RUT.netmodule ファイルには、RUT.cs をコンパイルして生成された IL コードが含まれています。このファイルには、RUT.cs によって定義される型、メソッド、フィールド、プロパティ、イベントなどを記述するメタデータ テーブルも含まれています。メタデータ テーブルには、RUT.cs によって参照される型、メソッドなども記述されています。JeffTypes.dll は別のファイルです。RUT.netmodule と同様に、このファイルには FUT.cs をコンパイルして生成された IL コードが含まれており、同様の定義と参照メタデータ テーブルも含まれています。ただし、JeffTypes.dll には追加のマニフェスト メタデータ テーブルが含まれているため、JeffTypes.dll はアセンブリになります。追加のマニフェスト メタデータ テーブルには、アセンブリを構成するすべてのファイル (JeffTypes.dll ファイル自体と RUT.netmodule ファイル) が記述されています。マニフェスト メタデータ テーブルには、JeffTypes.dll および RUT からエクスポートされたすべてのパブリック タイプも含まれます。

JeffTypes.dll を参照する何らかのクリネット コードが実行されている場合、メソッドが初めて呼び出されると、CLR はメソッドがパラメーター、戻り値、またはローカル変数として参照する型を検出します。次に、CLR は、マニフェストを含む参照アセンブリのファイルを読み込もうとします。アクセスされている型がこのファイルにある場合、CLR は内部の簿記を実行し、その型を使用できるようにします。参照された型が別のファイルにあることがマニフェストに示されている場合、CLR は必要なファイルの読み込みを試み、内部の簿記を実行して、型へのアクセスを許可します。CLR は、アンロードされたアセンブリ内の型を参照するメソッドが呼び出されたときにのみ、アセンブリ ファイルを読み込みます。

これは、アプリケーションを実行するために、参照されたアセンブリのすべてのファイルが存在する必要がないことを意味します。
そのため、使用頻度の低いソース クラスを NetModules でコンパイルし、必要に応じてロードすることで、パフォーマンスを向上させ、 Dll ファイル サイズを小さくすることで、変更管理と展開プロセスが容易になります。

画像と ジェフリー・リヒターからの引用の一部

于 2013-03-09T19:29:16.903 に答える