如果我们使用NGen.exe将其编译为本机代码,C#是否需要运行.NET框架?

时间:2012-10-20 22:19:45

标签: c# c++ .net

我知道C ++代码直接在本地机器上运行。我也知道我们可以使用NGen.exe将c#代码编译成本机代码。我的问题是

如果我们使用Native代码生成器NGen.exe将c#代码编译成本机代码,我们还需要.NET框架来运行吗?

3 个答案:

答案 0 :(得分:6)

事实上,如果你将C ++代码编译成Windows可执行文件,你仍然需要Win32 dll和其他东西。您的程序无法在除程序之外没有任何内容的CPU上运行。

C#的同一个故事。如果将C#编译为本机代码,则不需要JIT编译器,它是.NET运行时的一部分。但是你仍然需要.NET运行时的所有其他部分。

例如,包含其所有类的.NET框架未链接到您的程序中。如果他们将所有必需的.NET类放入您的二进制文件中,那么简单的Hello world应用程序就会变得非常庞大。

答案 1 :(得分:1)

您可以使用mono来构建一个C#应用程序,该应用程序包含使用静态链接框架库预编译的所有内容,并且不需要单独的运行时。

但是,我不推荐它。并非所有内容都可用于静态链接,并且使用JITter的一个原因是它使您的代码在所有部署中平均更快,因为您现在可以更好地利用特定于机器的优化。它甚至不是单声道设置为开箱即用的东西。

答案 2 :(得分:0)

是的,您需要框架,因为您的应用使用的库来自框架。

当您使用NGen时,不仅仅是您的代码是在本机代码上编译的,那么框架代码块就会被激活。也是,只是您的应用使用的正确部分。

所有这些都不会改变你的程序集(exe或dll)phisical字节,这会将IL编译为native并将这些本机字节存储在已编译的程序集缓存中。

编译程序集缓存中的引用仍然需要一些框架组件,特别是框架核心,它是来自开始的本机代码。