Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是.NET托管模块?_C#_.net - Fatal编程技术网

C# 什么是.NET托管模块?

C# 什么是.NET托管模块?,c#,.net,C#,.net,我知道这是一个Windows PE32,但我也知道.NET中的部署单元是一个程序集,它又有一个清单,可以由多个托管模块组成 我的问题是: 1) 在构建诸如类库或控制台应用程序等项目时,如何创建多个托管模块 2) 是否有一种方法可以指定编译器(例如通过项目属性)将源代码文件划分为多个托管模块。 如果是,这样做的好处是什么 3) 托管模块是否可以跨程序集 4) 编译源代码时是在磁盘上创建单独的文件,还是在内存中创建并直接嵌入到程序集中 编辑: @乔恩: 对于2):那么,在VisualStudio中编

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

我的问题是:

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

2) 是否有一种方法可以指定编译器(例如通过项目属性)将源代码文件划分为多个托管模块。 如果是,这样做的好处是什么

3) 托管模块是否可以跨程序集

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

编辑:

@乔恩:

对于2):那么,在VisualStudio中编译/构建源代码是否总是创建单个托管模块?如果是这样的话,那么我无法理解为什么VS不提供这样做的机制,尽管.NET支持这样做。 我同意用不同语言的模块创建程序集是不可管理的。这就是.NET允许创建多模块程序集的唯一原因吗? 我在Richter的CLR中通过C#读到模块也可以跨程序集,这有助于降低程序集大小,并通过在首次调用某些功能时按需下载程序集来减少内存占用,但我不太清楚为什么要跨程序集跨模块,为什么不创建一个新的程序集,该程序集隐式地在流程中创建一个新模块。你仍然会得到同样的好处

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

编辑: @乔恩:这是CLR通过C#(第三版)第43页摘录的内容: 也许我误解了这一点,但我觉得模块(属于程序集的文件)可以按需下载

例如,一个程序集可以由几种类型组成。 您可以将频繁使用的类型放在一个文件中,将不太频繁使用的类型放在一个文件中 另一个文件。如果您的程序集是通过Internet下载来部署的,则该文件 如果客户机 从不访问类型。例如,专门从事 UI控件可以选择在单独的模块中实现活动的可访问性类型(以 满足Microsoft的徽标要求)。仅限需要附加可访问性的用户 功能需要下载此模块

通过指定代码基元素,可以将应用程序配置为下载程序集文件 (在第3章中讨论)在应用程序的配置文件中 指向可在其中找到程序集所有文件的URL。“

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

csc /target:module Foo.cs Bar.cs
在这种情况下,您将得到一个名为
Foo.netmodule

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

3) 理论上,一个模块可以包含在多个组件中,但这样做没有意义——它会创建一个非常混乱的系统

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


编辑:我不认为VS构建模块是一个中间步骤。在VisualStudio中编译总是为每个项目创建一个程序集,并且该程序集只有一个模块。当你说CLR通过C#说“模块可以跨程序集”时,你确定你的意思不是程序集可以跨多个模块吗?您可以按需下载程序集的模块,但不能按需下载。如果您有特定的引用,我可以查找…

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


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

这会很有趣。。。用最适合这个问题的语言创建一个程序集。@安德鲁:如果你只使用一种.NET语言,有没有什么特别的原因/场景可以说明使用多模块程序集的意义?@安德鲁:你能解释一下吗。我的理解是,因为部署单元是一个程序集,所以JITter将加载在其上按需调用方法的类型,而不管该类型在程序集中的哪个模块中定义。在一个模块中定义很少使用的类型可能是有意义的,但是幕后的机制是什么使得在一个模块中创建一个不同的模块是值得的呢