我知道C ++代码直接在本地机器上运行。我也知道我们可以使用NGen.exe将c#代码编译成本机代码。我的问题是
如果我们使用Native代码生成器NGen.exe将c#代码编译成本机代码,我们还需要.NET框架来运行吗?
答案 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并将这些本机字节存储在已编译的程序集缓存中。
编译程序集缓存中的引用仍然需要一些框架组件,特别是框架核心,它是来自开始的本机代码。