5

.NETのネットモジュールのユースケースに興味があります。特に、.NETでソリューションを分割するためのより良い方法を検討してきましたが、展開するアセンブリの数はそれほど多くありません。ネットモジュールは非常に興味深いアイデアですが、デバッグを中断しているように見え、Visual Studioではネイティブにサポートされていません(MSBuild用ですが).NETにネイティブなものに依存したいので、ILMergeは興味深いものですが、私が本当に望んでいるものではありません。

私自身のプロジェクトのいくつかでは、FAKEも使い始めています。これにより、テストファイルの分離など、いくつかの興味深いビルド手順が可能になります。言い換えれば、カスタムコンパイルステップを書くことは問題ではありません。

4

3 に答える 3

5

ネットモジュール自体は実質的に価値がありません。それらのタイプとコードは、ランタイム環境でロードおよび実行することはできません。タイプをロードしてアセンブリからコードを実行することしかできないため、最終的には複数のネットモジュールを(マルチファイル)アセンブリに結合する可能性が非常に高くなります。それでは、これらの利点を見てみましょう。

Jeffrey Richterは、C# (p。44)を介した彼の著書CLRで、マルチファイルアセンブリの3つの使用法について言及しています。そのうちの2つは、ネットモジュールの使用によるものです。

  1. 「タイプを個別のファイルに分割して、ファイルを段階的にダウンロードできるようにすることができます[…]。タイプを個別のファイルに分割すると、購入してインストールするアプリケーションの部分的または断片的なパッケージ化と展開も可能になります。」

    少なくともMicrosoftのCLI(.NET)の実装は、最初から完全ではなく、マルチファイルアセンブリを段階的にロードするようです。アセンブリのモジュールは、その中のタイプが実際に必要な場合にのみ、ディスク(またはネットワーク?)からロードされるように見えます。

  2. 「さまざまなプログラミング言語で実装された型で構成されるアセンブリを作成できます。[…]」

    これが実際のシナリオで実際に多くの価値をもたらすかどうかはわかりません。(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
    
于 2012-08-22T16:08:10.900 に答える
1

ジェフリー・リッチターのアセンブリ埋め込み技術を使用できますか?自分で試したことはありませんが、有望そうです。

于 2011-03-13T16:30:30.160 に答える
0

回答がないため、コメントと回答に記載されている他のオプションは、一般的にネットモジュールよりも優れたアプローチと見なされていると思います。つまり、ネットモジュールの適切な使用法を実際に使用したり、知っている人はいないということです。

于 2011-03-14T04:10:51.547 に答える