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

时间:2019-03-11 08:07:03

标签: c# .net compilation unmanaged managed

在阅读.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。因此,要摆脱这种困惑,可以在这里提出来。

请让我知道这一点。

提前谢谢!! :)

1 个答案:

答案 0 :(得分:4)

如果您要谈论的是C#,VB(.NET)等语言的编译器,则:从编译器的角度来看,它们始终受 管理。他们输出的所有内容都是托管代码,即IL。在某些地方,C#等会直接将 close 变为非托管状态-例如:

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

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

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

如果您的意思有所不同,则有必要澄清一下您的想法,确实是非常具体的问题,最好是带有示例。