【问题标题】:How compiler knows whether the running code is Managed or UnManaged in .NET framework编译器如何知道在 .NET 框架中运行的代码是托管的还是非托管的
【发布时间】:2019-08-01 12:17:47
【问题描述】:

在阅读.NET 的基础知识(如Managed and Unmanaged code)时,代码在CLR and developed in .NET framework is managed 下运行,而unmanaged does not run under CLR and developed outside the .NET framework 下运行。 Moreover,思考和了解practicalities 关于代码和how they runhow the compiler knows the type 的代码是bit confusing。所以,为了摆脱这种困惑,觉得在这里问这个。

请让我知道这件事。

提前致谢!! :)

【问题讨论】:

  • 哪个编译器?就 csc 而言,它始终以托管平台 (MSIL) 为目标。该 IL 可能 稍后会被转换(IL2CPP 等)。还是你的意思是 C++ 编译器?
  • @MarcGravell 不,不是 C++ 编译器。 .NET 中的编译器

标签: c# .net compilation unmanaged managed


【解决方案1】:

如果您在谈论诸如 C#、VB(.NET) 等语言的编译器,那么:从编译器的角度来看,它们始终受到管理。他们输出的所有内容都是托管代码,即 IL。有些地方 C# 等 close 直接不受管理 - 例如:

  • 当使用unsafe 代码和“非托管指针”时,C# 可以直接与非托管内存对话 - 但它总是通过 IL 表达 如何 来做到这一点(IL 包含用于处理原始指针的运算符)
  • P/Invoke 层可以表达与外部非托管代码对话的边界

但是,在这两种情况下,都是运行时的 JIT 编译器(或者如果使用非 JIT 目标平台,则为 AOT 编译器)解释这些以 IL 表示的非托管意图,并输出 CPU 内在函数实施它们。但是……这正是 JIT / AOT 为 all IL 所做的,所以……没有什么不同。

所以:从 C# / VB(.NET) 等语言的编译器的角度来看,这里没有实际问题:它始终在输出方面 100% 工作- 并且由于编译器(自 Roslyn 以来)也是 .NET 代码,因此它们的实际执行也是 100% 管理的。

如果您的意思不同,那么值得澄清这个问题,非常非常具体地了解您想到的场景,最好是举例。

【讨论】:

  • 感谢您的信息。此外,您能否详细说明在执行时托管代码与非托管代码有何不同的流程[如果可能的话]。
  • @PPB 您询问了编译器,所以......这不相关。而在运行时,JIT 的目的是将 IL 转换为适合 CPU 的操作码,所以...... JIT 输出只是常规操作码。同样,您提出的问题并没有真正的意义。所以我很好奇你实际上想知道什么......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多