编译.NET程序集时使用NetModule的用例?

编译.NET程序集时使用NetModule的用例?,.net,build,assemblies,build-automation,netmodules,.net,Build,Assemblies,Build Automation,Netmodules,我对.NET中NetModule的用例感兴趣。特别是,我一直在寻找更好的方法来分解.NET中的解决方案,但没有那么多的程序集可以部署。这是一个非常有趣的想法,但它们都是。我更喜欢依赖.NET自带的东西,所以ILMerge,而有趣并不是我真正想要的 对于我自己的一些项目,我也开始使用它,它允许一些有趣的构建步骤,例如。换句话说,编写自定义编译步骤不是问题。可以使用吗?我自己也没有尝试过,但它看起来很有希望。由于缺乏回应,我认为评论和答案中提到的其他选项通常被认为是比netmodules更好的方法。

我对.NET中NetModule的用例感兴趣。特别是,我一直在寻找更好的方法来分解.NET中的解决方案,但没有那么多的程序集可以部署。这是一个非常有趣的想法,但它们都是。我更喜欢依赖.NET自带的东西,所以ILMerge,而有趣并不是我真正想要的


对于我自己的一些项目,我也开始使用它,它允许一些有趣的构建步骤,例如。换句话说,编写自定义编译步骤不是问题。

可以使用吗?我自己也没有尝试过,但它看起来很有希望。

由于缺乏回应,我认为评论和答案中提到的其他选项通常被认为是比netmodules更好的方法。我认为这意味着没有人真正使用或知道netmodule有什么好的用途。

netmodule本身实际上毫无价值:它们的类型和代码无法在运行时环境中加载和执行。您只能从程序集中加载类型和执行代码,因此很可能最终会将多个NetModule组合成一个(多文件)程序集。让我们来看看这些好处。

Jeffrey Richter在他的书(第44页)中提到了多文件程序集的三种用途,其中两种是由于NetModule的使用:

  • “您可以将类型划分到不同的文件中,从而允许以增量方式下载文件[…]。将类型划分到不同的文件中还允许为您购买和安装的应用程序进行部分或零碎的打包和部署。”

    至少Microsoft的CLI(.NET)实现似乎是以增量方式加载多文件程序集,而不是从一开始就完全加载。程序集中的模块只有在实际需要其内部类型时才显示为从磁盘(或从网络?)加载

  • “您可以创建由不同编程语言实现的类型组成的程序集。[…]”

    我不确定这在现实场景中是否真的增加了很多价值,(a)因为VisualStudio不支持对netmodules的项目引用,(b)因为您可以从程序集中获得相同的好处

    多程序集和多文件程序集方法之间有一个显著的区别:默认情况下,一个程序集无法访问另一个程序集的类型,而这些类型具有
    内部
    /
    朋友
    (即程序集)可见性。如果改为编译模块,然后将它们链接到单个多文件程序集中,则从C#编译的模块可以访问使用VB.NET编译的模块的
    内部类型(反之亦然)

    您将在下面找到这方面的简要演示


    CsharpClass.cs:

    内部类CsharpClass{}
    
    VbClass.vb:

    Friend类VbClass:End类
    
    Program.cs:

    公共静态类程序
    {
    公共静态void Main()
    {
    var vbClass=新的vbClass();
    var csharpClass=新的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
    文件扩展名没有什么神奇之处;这只是一种约定,但输出文件是常规的.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):错误CS0122:“VbClass”由于其保护级别而不可访问
    Program.cs(5,23):错误CS0143:类型“VbClass”未定义构造函数
    Program.cs(6,31):错误CS0122:“CsharpClass”由于其保护级别而不可访问
    Program.cs(6,27):错误CS0143:类型“CsharpClass”未定义构造函数
    

  • @Ryan你对ILMerge有什么特别的不满?@chibacity:这是一个可怕的反复无常的事实,特别是对于已经被ILMerge合并的第三方程序集。此外,几乎没有记录的、神秘的错误消息也不好玩。@pblasucci“可怕的反复无常”我想我一定有过更好的体验。@pblasucci你的反应让我思考。我忽略的一件大事是,CLI是很棘手的,但我很久以前就放弃了。我一直使用下面的GUI工具,在幕后使用ILMerge:。@chibacity:我对ILMerge没有任何异议。然而,我公司的一些人不喜欢/不想要它。当.NET似乎有一个现有的替代方案时,它也是堆栈中的一个额外工具。这是一种有趣的技术。然而,我的问题更多的是确定NetModule的用途。