c# - 什么是 .NET 托管模块?

标签 c# .net

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

我的问题是:

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

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

3)托管模块可以跨越程序集吗?

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

编辑:

@乔恩:

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

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

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

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

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

最佳答案

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

csc /target:module Foo.cs Bar.cs

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

的文件

2) 请参阅问题 1 - 您无法从 Visual Studio 执行此操作,但可以从命令行执行此操作。我不知道有什么好处。编辑:我同意 Andrew 的说法,即您可以通过这种方式从多种语言创建程序集——但我认为这是不切实际的。您必须计算出一个适当的依赖链,以便您可以首先构建一个完整的模块,然后构建下一个模块等等……在这一点上,为什么不首先构建单独的程序集呢?诚然,它实际上是一个额外的可访问域……但仅此而已。我相信在几乎所有情况下,这样做的缺点都可能超过优点。如果您真的想要构建单个程序集,您始终可以在构建单独的程序集后使用 ilmerge。

3) 好吧,理论上单个模块可以包含在多个程序集中,但这样做没有意义 - 它会创建一个非常困惑的系统。

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

编辑:我不认为 VS 将构建模块作为中间步骤。在 Visual Studio 中编译总是为每个项目创建一个程序集,并且该程序集有一个模块。当你说通过 C# 的 CLR 说“模块可以跨越程序集”时,你确定你不是说程序集可以跨越多个模块吗?您可以按需下载程序集的模块,但反之则不行。如果你有具体的引用资料,我可以查一下...

关于c# - 什么是 .NET 托管模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443628/

相关文章:

c# - 将用户给定的字符串与 C# 中的答案进行比较

c# - 如何向 Grid.Mvc 添加导出功能,以便将当前搜索结果导出到 excel?

c# - Xamarin.Android Material 设计图标

.net - 用于 Windows 7 开发的本地 LDAP 服务器

c# - 文化未应用于多语言网站

c# - 如何向用户控件添加分页?

c# - 如何将 TableLayoutPanel 的底行滚动到 View 中

c# - 如何设置树莓派串口波特率?

.net - SqlCommand查询的长度有什么限制

c# - QueryOver: 选择 ... where property in (...)