什么是.NET托管模块?

Abh*_*tel 5 .net c#

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

我的问题是:

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

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

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

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

编辑:

@乔恩:

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

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

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

"例如,程序集可以包含多种类型.您可以将常用类型放在一个文件中,将较不常用的类型放在另一个文件中.如果通过Internet下载部署程序集,则不经常使用的文件如果客户端从不访问类型,则可能不必将类型下载到客户端.例如,专门用于UI控件的独立软件供应商(ISV)可能选择在单独的模块中实现Active Accessibility类型(以满足Microsoft的徽标要求)只有需要额外辅助功能的用户才需要下载此模块.

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

Jon*_*eet 6

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

csc /target:module Foo.cs Bar.cs
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


And*_*zub 5

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

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