【问题标题】:Is compilation different for each targeted .NET Platform?每个目标 .NET 平台的编译是否不同?
【发布时间】:2016-06-04 16:13:57
【问题描述】:

在 .NET 中,我们有多个平台,每个平台都由自己的运行时、自己的基础库和用于启动运行时的支持软件等组成。

关于那些不同的平台,我们可以在编译代码时针对特定平台。这意味着我们为特定平台编译

在新的 .NET Core 项目模型中,这一点更加清晰。在project.json 文件中,我们在frameworks 部分指定我们要编译的平台,列出它们的TFM。

我的问题是,据我了解,开发到平台或其他平台的主要区别在于可用的基础库(例如,对于完整的 .NET,我们拥有整个 BCL)。但这似乎是一个“运行时问题”而不是“编译时问题”。

原因是,当代码作为 IL 部署到特定平台以及何时运行时,它会查看所需基础库中的必要程序集是否可用,对吗?

既然如此,为什么会有“为特定平台编译”的想法?每个平台的编译过程是否不同?每个平台生成的 IL 是否不同?

【问题讨论】:

  • 生成的 IL stays the same 只有一个标志来决定应用程序运行时会发生什么(将 IL 转换为 x64 操作系统上的 x86 机器代码等)
  • 首先拥有 IL 的全部要点在于它不是特定于平台的,并且任何兼容的运行时必须都能够运行它(根据定义;如果不能,那么它就不是兼容的运行时)。
  • 这正是我的疑问,因为 IL 不是特定于平台的,任何兼容的运行时都必须能够运行它,为什么我们在构建时需要针对特定​​平台?平台之间的差异不仅仅是在运行时?我不明白为什么编译不应该是一样的。

标签: c# .net dll clr .net-core


【解决方案1】:

既然如此,为什么会有“为特定平台编译”的想法?每个平台的编译过程是否不同?每个平台生成的 IL 是否不同?

IL 有所不同,但通常只是略有不同,即程序集标志可能不同,以指示编译时指定的目标平台。

当然,您的程序集中可能有条件编译的代码,受#if 指令保护。我假设您指的不是那种差异。但仅仅因为 IL 的主要部分在平台之间是相同的,并不一定意味着您可以在任何平台上运行任何 IL。

通常,在编译期间指定的目标平台将是一个关键选择,因为托管代码与仅适用于特定架构的本机代码进行某种互操作。另一个原因是,如果程序出于某种原因需要出于虚拟地址空间的原因(即进程预计需要分配比 x86 进程可用的标称最大 3GB 更多的空间)使用 x64 架构。 p>

【讨论】:

    猜你喜欢
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多