从低级程序员的角度来看.NET框架

时间:2010-06-29 19:01:20

标签: c# .net

当我学习.NET时,我把它看作是一个运行我的.NET程序的平台,它有自己的Stack& amp;堆。

但是现在在了解了更多关于事物的内容之后,我看到.NET应用程序就像任何其他C / C ++本机应用程序一样。它是可移植可执行文件(PE)文件格式,带有新的数据目录& .text部分填充了MSIL代码而不是机器代码。唯一的区别是加载了很少的DLL(被认为是.NET平台)(像任何其他Dll依赖项一样)。

我猜在入口点有一些机器代码调用加载的DLL(.net平台),这些DLL的函数从.text部分读取MSIL(段更正确)并生成等效的机器代码把它放在某种缓冲区中(我不知道它会是哪个区域。我不能将.text& .data作为readonly。它们会堆叠还是堆叠?)。然后使EIP指向此指令缓冲区。最后几条指令再次回调到DLL中,重复MSIL的其余部分。

截至Managed Heap& Managed Stack它们只是进程堆的一部分。堆。它只是很少的功能(称为GC)将跟踪内存分配和&从这部分记忆中解除分配。

我喜欢这种现实主义观点。我不知道我到底有多远。我只是猜测这些事情。请纠正我&告诉我更多相关信息。它会与这种观点相差多远?从这个角度来看,我在哪里可以了解更多有关.NET平台的信息?

7 个答案:

答案 0 :(得分:4)

您错过了一个非常重要的观点 - CIL代码(以前称为MSIL)是安全代码。你不能做任意指针伏都教,类型转换或类似邪恶的东西(除了一些在不安全的代码区域)。这可能是与C(++),Pascal等其他语言最重要的区别。这种安全保证深深地融入了语言,类型系统和运行时设计中。

答案 1 :(得分:3)

CLR via C#描述了一些内部.NET事物,包括PE加载过程和在您自己的进程中托管CLR。

答案 2 :(得分:3)

对于CLR检查:CLR via C#

如果您对“低级”.NET / CLR感兴趣,这本书真的很棒。

对于JVM检查:Java Virtual Machine

答案 3 :(得分:2)

您的描述缺少一件事:.NET程序集中的大多数代码都是实时(JIT)编译,这意味着MSIL直到刚才才转换为机器代码在第一次调用该方法之前,此时它将被缓存以供将来使用。这大大加快了启动时间,代价是在第一次调用每个方法时出现轻微的减速。 (我省略了一些细节,比如JIT编译器在被调用几次后可能会重新优化该函数。)

从操作系统的角度来看,JIT编译的代码存在于堆上。 JIT编译器会将代码标记为可执行代码,并执行其他任何伏都教以使其正确运行。

答案 4 :(得分:2)

这不是100%准确,但我会说你已经对框架的某些部分进行了很好的概述。

如果您想了解更多信息,建议您先查看.NET Framework FAQ,一旦完成,请阅读.NET 1.1 Inside the .NET Framework系列文章。这些文章不会涵盖过去4个版本中发生的许多进展,但它们将为.NET Framework提供良好,坚实的基础。

答案 5 :(得分:1)

最近我一直在阅读Pro C# 2008 and the .NET 3.5 Platform(现在还有一个VS2010/.NET 4.0版本),它解释了.NET字节码如何在后端工作,以及如何通过使用反射器等来了解真正被调用的东西。它密集而且长(有时候比我想要的更多信息),但是它提供了很好的信息阅读。

答案 6 :(得分:1)