ネットモジュール自体は実質的に価値がありません。それらのタイプとコードは、ランタイム環境でロードおよび実行することはできません。タイプをロードしてアセンブリからコードを実行することしかできないため、最終的には複数のネットモジュールを(マルチファイル)アセンブリに結合する可能性が非常に高くなります。それでは、これらの利点を見てみましょう。
Jeffrey Richterは、C# (p。44)を介した彼の著書CLRで、マルチファイルアセンブリの3つの使用法について言及しています。そのうちの2つは、ネットモジュールの使用によるものです。
「タイプを個別のファイルに分割して、ファイルを段階的にダウンロードできるようにすることができます[…]。タイプを個別のファイルに分割すると、購入してインストールするアプリケーションの部分的または断片的なパッケージ化と展開も可能になります。」
少なくともMicrosoftのCLI(.NET)の実装は、最初から完全ではなく、マルチファイルアセンブリを段階的にロードするようです。アセンブリのモジュールは、その中のタイプが実際に必要な場合にのみ、ディスク(またはネットワーク?)からロードされるように見えます。
「さまざまなプログラミング言語で実装された型で構成されるアセンブリを作成できます。[…]」
これが実際のシナリオで実際に多くの価値をもたらすかどうかはわかりません。(a)Visual Studioがネットモジュールへのプロジェクト参照をサポートしていないため、および(b)アセンブリで同じ利点を得ることができるためです。
マルチアセンブリとマルチファイルアセンブリのアプローチには、注目すべき違いが1つあります。あるアセンブリは、デフォルトでは、internal
/ Friend
(つまりアセンブリ)の可視性を持つ別のアセンブリのタイプにアクセスできません。代わりにモジュールにコンパイルしてから、それらを単一のマルチファイルアセンブリにリンクする場合、C#からコンパイルされinternal
たモジュールは、VB.NETでコンパイルされたモジュールのタイプにアクセスできます(またはその逆)。
これについての簡単なデモンストレーションを以下に示します。
CsharpClass.cs:
internal class CsharpClass { }
VbClass.vb:
Friend Class VbClass : End Class
Program.cs:
public static class Program
{
public static void Main()
{
var vbClass = new VbClass();
var csharpClass = new CsharpClass();
}
}
ネットモジュールのスクリプトを作成します。
csc.exe /t:module /out:CsharpClass.netmodule CsharpClass.cs
vbc.exe /t:module /out:VbClass.netmodule VbClass.vb
csc.exe /t:exe /out:Program.exe /addmodule:CsharpClass.netmodule /addmodule:VbClass.netmodule Program.cs
このビルドはエラーなしで機能し、実行されます。
.netmodule
ファイル拡張子には魔法のようなものは何もないことに注意してください。これは単なる慣例ですが、出力ファイルは通常の.NETDLLです。
アセンブリのスクリプトを作成します。
csc.exe /t:library /out:CsharpClass.dll CsharpClass.cs
vbc.exe /t:library /out:VbClass.dll VbClass.vb
csc.exe /t:exe /out:Program.exe /r:CsharpClass.dll /r:VbClass.dll Program.cs
このビルドは次の理由で失敗します:
Program.cs(5,27): error CS0122: 'VbClass' is inaccessible due to its protection level
Program.cs(5,23): error CS0143: The type 'VbClass' has no constructors defined
Program.cs(6,31): error CS0122: 'CsharpClass' is inaccessible due to its protection level
Program.cs(6,27): error CS0143: The type 'CsharpClass' has no constructors defined