C# 使用ngen.exe编译内核

C# 使用ngen.exe编译内核,c#,osdev,ngen,C#,Osdev,Ngen,我知道Cosmos和SharpOS已经制作了自己的编译器来从C#构建二进制代码,但是你能用微软的.NET AOT做同样的事情吗?也就是说,将C#编译为x86。我假设您必须省去使用语句,就像操作系统开发中包含语句一样。 感谢您的反馈。谢谢 编辑:我想在内核开发中使用C#的主要原因是托管代码带来的内存管理,特别是单地址空间属性。是否需要启动JIT编译器,然后编译C#?还是环境在那一点上仍然太脆弱?感谢您的反馈不,您无法使用ngen。ngen输出本身的级别不足以在没有所有支持CLR和windows基础

我知道Cosmos和SharpOS已经制作了自己的编译器来从C#构建二进制代码,但是你能用微软的.NET AOT做同样的事情吗?也就是说,将C#编译为x86。我假设您必须省去使用语句,就像操作系统开发中包含语句一样。 感谢您的反馈。谢谢


编辑:我想在内核开发中使用C#的主要原因是托管代码带来的内存管理,特别是单地址空间属性。是否需要启动JIT编译器,然后编译C#?还是环境在那一点上仍然太脆弱?感谢您的反馈

不,您无法使用ngen。ngen输出本身的级别不足以在没有所有支持CLR和windows基础设施的情况下运行内核

您提到的其他项目将CLR的子集编译为二进制,这是一个稍微不同的过程。

您不能。 C#是一种人工语言,这意味着它的代码(IL代码)将在运行时编译。。。您可以编写自己的编译器,将编译器C编译成本机代码,但这将使您没有很多.NET的特性,如垃圾收集器、内存管理、JIT编译器,并且将是C++之类的,只是用C语言语法< /P>
作为一个抽象的想法,我认为您可以使用JIT编译器和垃圾收集器创建一个小型CLR替代方案,它将被嵌入到您的应用程序中,但这将增加您的应用程序大小,并且您将需要更多的资源…

简短回答:不,使用ngen.exe/编译器不足以编译内核

答案很长:ngen.exe/AOT编译器减少了JIT编译器的工作,但CLR不仅仅是一个JIT编译器——即使不引用任何其他程序集,它也提供诸如内存管理、垃圾收集、类型检查和异常处理等功能(以及除此之外的所有其他功能)

是的,使用ngen确实使您离在C#中生成内核更近了一步,但这并没有让您更近一步——您仍然有大量其他问题需要解决,这些问题更容易通过编写针对您的预期环境(而不是CLR)的编译器来解决


更新:如果您想要C#的“托管”部分,那么您需要自己创建一个托管环境来运行代码,即垃圾收集器等。。。(或者尝试使用CLR这样的现有on,这可能会更困难)。这是一项非常艰巨的任务,即使有了底层操作系统的支持,当你是操作系统时,这项任务也会更加艰巨(尽管这并非不可能——毕竟这正是奇点和宇宙这样的项目所做的)。

我发现了一种用于将IL编译为本机代码的方法,在cosmOS项目中使用

你的意思是你想写一个内核,但是内核开发的所有特性都在哪里为你处理?您最好使用现有的内核。这正是他们的目的。有点正确,但大多数情况下并非如此——当人们说C#是一种托管语言时,他们的意思是它通常在托管环境(如CLR)的上下文中运行,但使它成为托管语言的不是语言本身,而是运行时。正如你可以编译C++代码到IL(被称为托管C++)一样,你可以(至少在理论上)编译C ^到完全的本地输出。我认为不是管理环境使语言成为了语言,而是编译成人工代码的编译器,正如我说的,你可以编译成本地代码,但是您将无法运行CLR功能,例如车库收集器,因此您应该担心内存管理等问题,并且您必须编写更多代码,至少要编写Objects的析构函数。我还没有放弃,但这确实回答了有关ngen的问题。Thanks@apophis如果你刚开始在内核开发,那么你应该开始更传统的语言,如C,C++或汇编。