我知道 C++ 代码直接在本地机器上运行。我也知道我们可以使用 NGen.exe 将 c# 代码编译为本机代码。我的问题是
如果我们使用 Native 代码生成器 NGen.exe 将 c# 代码编译成原生代码,还需要 .NET 框架来运行吗?
事实上,如果你将 C++ 代码编译成 Windows 可执行文件,你仍然需要 Win32 dll 和其他东西。你的程序不能在除了你的程序之外没有任何东西的 CPU 上运行。
C# 也是如此。如果将 C# 编译为本机代码,则不需要 JIT 编译器,它是 .NET 运行时的一部分。但是您仍然需要 .NET 运行时的所有其他部分。
例如,.NET 框架及其所有类都没有链接到您的程序中。如果他们将所有必需的 .NET 类放入您的二进制文件中,那么一个简单的Hello world
应用程序就会变得庞大。
您可以使用 mono 构建一个 C# 应用程序,该应用程序的所有内容都使用静态链接的框架库进行了预编译,并且不需要单独的运行时。
不过,我不会推荐它。并非所有东西都可用于静态链接,使用 JITter 的好处之一是它可以让您的代码在所有部署中平均更快,因为您现在可以更好地利用特定于机器的优化。即使是单声道也不是开箱即用的。
是的,您需要框架,因为您的应用程序使用的库来自框架。
当您使用 NGen 时,不仅您的代码是在本机代码上编译的,大量的框架代码也被“本地化”,只是您的应用程序使用的正确部分。
所有这一切都不会改变您的程序集(exe 或 dll)物理字节,这会将 IL 编译为本机并将此本机字节存储在已编译的程序集缓存中。
编译程序集缓存中的引用仍然需要一些框架组件,特别是框架核心,它是一开始的本机代码。