编译器如何知道正在运行的代码在 .NET 框架中是托管还是非托管



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

请让我知道这一点。

提前感谢!! :)

如果你谈论的是C#,VB(.NET)等语言的编译器,那么:从编译器的角度来看,它们总是被管理的。他们输出的所有内容都是托管代码,即 IL。有些地方 C# 等接近直接非托管- 例如:

  • 当使用unsafe代码和"非托管指针"时,C# 可以直接与非托管内存通信 - 但它始终表示如何通过 IL 执行此操作(IL 包含用于处理原始指针的运算符)
  • P/Invoke 层可以表示与外部非托管代码通信的边界

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

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

如果你的意思不同,那么值得澄清这个问题,非常非常具体地说明你想到的场景,最好是用例子。

相关内容

  • 没有找到相关文章

最新更新