簡體   English   中英

編譯.NET程序集時使用netmodules的用例?

[英]Use cases for using netmodules when compiling .NET assemblies?

我對.NET中netmodules的用例很感興趣。 特別是,我一直在尋找更好的方法來破解.NET中的解決方案,但沒有足夠多的程序集來部署。 Netmodules是一個非常有趣的想法,但它們似乎打破了調試,並且在Visual Studio中本身不受支持(盡管它們用於MSBuild) 我寧願依賴原生的.NET,所以ILMerge,雖然有趣並不是我真正想要的。

對於我自己的一些項目,我也開始使用FAKE ,它允許一些有趣的構建步驟,例如分離出測試文件 換句話說,編寫自定義編譯步驟不是問題。

netmodule本身幾乎一文不值:它們的類型和代碼無法由運行時環境加載和執行。 您只能從程序集中加載類型和執行代碼,因此很可能最終將多個netmodule組合到一個(多文件)程序集中。 那么讓我們來看看這些的好處。

Jeffrey Richter在他的書籍CLR中通過C# (第44頁)提到了多文件程序集的三種用法,其中兩種是使用netmodules:

  1. “您可以在不同的文件中對類型進行分區,允許逐步下載文件[...]。將類型分區為單獨的文件還允許對您購買和安裝的應用程序進行部分或零碎的打包和部署。”

    至少微軟的CLI(.NET)實現似乎是逐步加載多文件組件,而不是從一開始就完全加載。 當組件中的模型實際需要時,組件中的模塊似乎只能從磁盤(或從網絡?)加載。

  2. “你可以創建由不同編程語言實現的類型組成的程序集。[...]”

    我不確定這實際上在實際場景中增加了很多價值,(a)因為Visual Studio不支持對netmodules的項目引用,(b)因為你可以獲得與程序集相同的好處。

    多組件和多文件組裝方法之間存在一個顯着差異:一個組件默認情況下不能訪問具有internal / Friend (即組件)可見性的另一個組件類型。 如果您正在編譯模塊而不是將它們鏈接到單個多文件程序集中,則從C#編譯的模塊可以訪問使用VB.NET編譯的模塊的internal類型(反之亦然)。

    您將在下面找到一個簡短的演示。


    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(); } } 

    構建netmodules的腳本:

     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文件擴展名沒有什么神奇之處; 這只是一個約定,但輸出文件是一個常規的.NET DLL。

    構建程序集的腳本:

     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 

你能用傑弗里里希特的裝配嵌入技術嗎? 我自己沒試過,但看起來很有希望。

缺乏回應使我認為評論和答案中提到的其他選項通常被認為是比netmodules更好的方法。 通過這種方式,我認為這意味着沒有人真正使用或知道網絡模塊的任何良好用途。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM