【问题标题】:How to Compile with ngen.exe and How to run the native code that is generated?如何使用 ngen.exe 进行编译以及如何运行生成的本机代码?
【发布时间】:2013-12-07 07:04:54
【问题描述】:

出于特殊目的,我想使用 ngen 命令行编译 C# 程序。所以我在 VS2010 中创建了一个控制台应用程序并命名为ngentest。在vs2010\projects\ngentest\bin\debug 中创建一个名为ngentest.vshost.exe 的文件。 我在VS2010命令提示符中使用了这个文件作为ngen命令参数,如下:

ngen "c:\documents\vs2010\projects\ngentest\bin\debug\ngentest.vshost.exe"

但是当我这样做时,我无法收到PublicKeyToken,而且我在任何地方都找不到任何程序集! 如果创建了我的程序集,它在哪里?我怎么能找到它?我如何运行它(使用命令,或者...!)以获取我的输出?

否则,当我从 VS 的 Build 菜单中使用 build ngen 构建项目时,会在上述目录中创建一些文件,其中一个是 ngentest.exe

【问题讨论】:

  • 首先,您应该在 ngentest.exe 上执行此操作,而不是在 ngentest.vshost.exe 上。其次,存储在哪里无关紧要,系统会为您找到它。它位于 Windows 目录下的隐藏文件夹中。
  • 但据我了解,ngentest.exe 包含 MSIL 代码,但 ngen 需要托管代码来生成二进制代码(特定于机器)。如果我使用命令“ngen ngentest.exe”,我如何运行我的项目?
  • 我读过这个页面,但对我没有帮助...
  • 该页面的第一段是“本机映像生成器 (Ngen.exe) 是一种提高托管应用程序性能的工具。Ngen.exe 创建本机映像,这些映像是包含已编译处理器的文件- “你不明白哪一部分?
  • 阅读“Fusion Engine”,你就会知道 .Net 从哪里加载程序集

标签: c# .net visual-studio-2010 native-code ngen


【解决方案1】:

当您编译 C# 代码时,它会被编译成 IL 程序集。而 NGEN 将 IL 程序集作为输入,并将程序集及其依赖项安装到 Native Image Cache 中。

对于您的示例二进制文件,您需要打开一个管理员 VS 命令提示符,然后键入以下内容

ngen install ngentest.exe

这会将您的exe 及其依赖项dll 文件安装到本机图像缓存中。您在此处使用程序集的文件名。

然后,当您运行 exe 时,.NET 运行时将加载并运行安装到本机映像缓存的本机映像。您无需采取任何额外步骤即可让 .NET 运行本机映像。运行时检查 Native Image Cache 以查看 IL 程序集是否存在有效的 Native Image。

您可以通过键入以下命令来验证是否安装了本机映像:

ngen display ngentest

在这种情况下,您必须使用程序集名称。请注意,32 位 ngen 将仅安装和显示 32 位程序集,而 64 位 ngen 仅安装和显示 64 位程序集。

有关本地图像加载的更多信息,请参阅http://blogs.msdn.com/b/junfeng/archive/2007/02/18/native-image-loading.aspx

请注意,ngentest.vhost.exe 是 VS 为提供更好的调试体验而创建的工件。 VS使用它。您不应该将它用于 NGEN 或其他任何事情。请参阅问题:What is the purpose of the vshost.exe file? 了解更多信息。

【讨论】:

  • 如果我在客户端计算机上,我将没有 VC 命令提示符。 .net 4.5 中的 ngen 在哪里?
  • ngen.exe 位于框架目录中:%windir%\Microsoft.NET\Framework\v4.0.30319\ngen.exe(32 位)和 %windir%\Microsoft.NET\Framework64\v4。 0.30319\ngen.exe 用于 64 位
  • 为了让答案更好,我认为这条信息会很好:When there is a change to your assembly, after you install the update, you just need to simply call "ngen.exe update", and CLR will automatically regenerate all the native images affected by the change to your assembly. 奇怪的是这不接受文件路径... :^)
  • @user21, running update 是微软推荐的,但速度很慢。它将检查整个系统中的所有程序集,这可能需要几分钟。或者,考虑再次运行install。这只会更新依赖项。
猜你喜欢
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2012-05-23
  • 2011-06-22
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多