什么是.NET托管模块?

时间:2010-03-14 20:27:25

标签: c# .net

我知道它是Windows PE32,但我也知道.NET中的部署单元是一个程序集,而该程序集又有一个清单,可以由多个托管模块组成。

我的问题是:

1)在构建项目(如类lib或控制台应用程序等)时,如何创建多个托管模块。

2)有没有办法将这个指定给编译器(例如通过项目属性)将源代码文件分区为多个托管模块。 如果是这样的话有什么好处?

3)托管模块是否可以跨组件?

4)在编译源代码时是在磁盘上创建单独的文件还是在内存中创建并直接嵌入到程序集中?

编辑:

@乔恩:

For 2):那么,在visual studio中编译/构建源总是创建一个托管模块吗?如果是这样,那么我无法理解为什么VS不提供这样做的机制,尽管.NET支持这样做。 我同意用不同语言的模块创建程序集是无法管理的。这是.NET允许创建多模块组件的唯一原因吗? 我通过C#读取Richter的CLR,模块也可以跨越程序集,这可以帮助减少程序集大小,并通过在第一次调用某些功能时按需下载程序集来减少内存占用,但我不太确定为什么人们想要跨组件跨越模块,为什么不创建一个新的组件,其中隐含在过程中创建一个新模块。你仍然可以获得同样的好处。

项目4)涉及“.netmodule”文件。 作为VS构建过程的一部分,我没有看到在obj目录中创建的任何“.netmodule”文件。我通常会注意到.pdb,.dll / .exe和一个* FileListAbsolute文件,因此有关是否为托管模块创建任何单独文件的问题。

编辑: @Jon:以下是CLR通过C#(第3版)第43页的摘录: 也许我误解了这个,但听起来我可以按需下载一个模块(属于程序集的文件)。

“例如,程序集可以包含多种类型。 您可以将常用类型放在一个文件中,将不常用的类型放在一个文件中 另一个文件。如果你的程序集是通过Internet下载它来部署的,那么文件就是 如果客户端,可能不必将不常使用的类型下载到客户端 永远不会访问类型。例如,专门从事的独立软件供应商(ISV) UI控件可能选择在单独的模块中实现Active Accessibility类型(to 满足微软的Logo要求)。仅限需要其他辅助功能的用户 功能需要下载此模块。

您可以通过指定codeBase元素来配置应用程序以下载程序集文件 (在第3章中讨论)在应用程序的配置文件中。 codeBase元素标识 指向可以找到所有程序集文件的位置的URL。“

2 个答案:

答案 0 :(得分:6)

1)您无法在Visual Studio中执行此操作。您可以使用以下命令从命令行执行此操作:

csc /target:module Foo.cs Bar.cs

在这种情况下,你最终会得到一个名为Foo.netmodule

的文件

2)请参阅问题1 - 您无法从Visual Studio执行此操作,但您可以从命令行执行此操作。我不知道有什么好处。编辑:我同意安德鲁的声明,你可以用这种方式用多种语言创建一个程序集 - 但我相信这是不切实际的。你必须找到一个合适的依赖链,以便你可以先构建一个完整的模块,然后再构建一个完整的模块......那时,为什么不首先构建单独的程序集呢?它实际上是一个额外的可访问域,诚然......但这就是所有。我相信这种情况的缺点可能超过几乎所有情况下的优势。如果确实想要构建单个程序集,则可以在构建单独的程序集后始终使用ilmerge。

3)嗯,从理论上讲,单个模块可以包含在多个程序集中,但这样做没有意义 - 它会造成一个非常混乱的系统。

4)我不太确定你的意思。 Visual Studio在obj目录中创建一些中间文件,如果这是你的意思。命令行编译器不会留下任何额外的文件,但它可能创建它在完成时删除的中间文件 - 我真的不知道。

编辑:我不认为VS构建模块是一个中间步骤。在Visual Studio中进行编译始终为每个项目创建一个程序集,并且该程序集具有单个模块。当你说通过C#的CLR说“模块可以跨越组件”时你确定你并不是说组件可以跨越多个模块吗?您可以按需下载程序集的 modules ,但不能相反。如果您有特定的参考,我可以查一查......

答案 1 :(得分:5)

您无法使用VS创建模块,但您可以使用编译器来创建模块。模块是文件系统上的单独文件,可以在一个程序集中使用不同语言编写多个模块。

编辑:您也可以将很少使用的类放在单独的模块中。只有在需要类时才会加载这些模块。

相关问题