问题标签 [ngen]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4612 浏览

c# - 如何在安装过程中正确安装 NGen .NET 应用程序

我正在Inno Setup为我的应用程序生成安装程序,并且我想在安装过程中为我的应用程序的NGen编写一个脚本。我希望代码能够将NGen文件定位x86为 、x64AnyCPU. 我希望能够在和系统上进行NGen 。我怎样才能做到这一点?32bit64bit

我找到了几个有用的链接:
获取 .NET Framework 目录路径
http://nsis.sourceforge.net/Get_directory_of_installed_.NET_runtime
我发现这是一个非常复杂的问题 - 最多可以有 4 个不同的版本NGen应用程序:

  1. 适用于 CLR 2.0 和 32 位系统
  2. 适用于 CLR 2.0 和 64 位系统
  3. 适用于 CLR 4.0 和 32 位系统
  4. 适用于 CLR 4.0 和 64 位系统

更复杂的是应用程序可以针对 32 位 CPU 并在 64 位系统上运行。


所以我想到的是一个看起来像这样的函数:

并在安装成功后在某处调用它[Code]

它会像这样工作:

  1. application.exe (tcpu64, tclr20)
    在 64 位系统上,它会生成针对 64 位 CPU 和 CLR 2.0 的本机映像,结果:= True
    在 32 位系统上它不会做任何事情,结果:= False

  2. library1.dll ( tcpu64 , tclr40)
    在 64 位系统上,它会生成针对 64 位 CPU 和 CLR 4.0 的本机映像,结果:= True
    在 32 位系统上它不会做任何事情,结果:= False

  3. library2.dll (tcpu32, tclr20)
    在 64 位系统上,它将生成针对 32 位 CPU 和 CLR 2.0 的本机映像,结果:= True
    在 32 位系统上,它与 64 位系统上的操作相同

  4. library3.dll (tcpu32, tclr40)
    在 64 位系统上,它将生成针对 32 位 CPU 和 CLR 4.0 的本机映像,结果:= True
    在 32 位系统上,它与 64 位系统上的操作相同

  5. library4.dll (tcpuAny, tclr20)
    在 64 位系统上,它将生成针对 64 位 CPU 和 CLR 2.0 的本机映像,结果:= True
    在 32 位系统上,它将生成针对 32 位 CPU 和 CLR 2.0 的本机映像,结果:= True

  6. library5.dll (tcpuAny, tclr40)
    在 64 位系统上,它将生成针对 64 位 CPU 和 CLR 4.0 的本机映像,结果:= True
    在 32 位系统上,它将生成针对 32 位 CPU 和 CLR 4.0 的本机映像,结果:= True


所以要让它工作,我需要知道 .NET 运行时目录的 4 个不同路径。这是我发现的:

  1. 32位系统CLR 2.0
    获取“HKLM\Software\Microsoft\.NETFramework”中“InstallRoot”的值,保存到value1
    获取“HKLM\Software\Microsoft\.NETFramework\Policy\v2.0”中第一个值的名称,保存到值 2 值
    1 + “v2.0” 。+ value2 + "\ngen.exe" => win
    示例:"c:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe"
    我认为这在 32 位和 64 位系统上同样适用

  2. 32位系统CLR 4.0
    获取“HKLM\Software\Microsoft\.NETFramework”中“InstallRoot”的值,保存到value1
    获取“HKLM\Software\Microsoft\.NETFramework\Policy\v4.0”中第一个值的名称,保存到值 2 值
    1 + “v4.0” 。+ value2 + "\ngen.exe" => win
    示例:"c:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe"
    我假设这在 32 位和 64 位系统上同样适用

  3. 64 位系统 CLR 2.0
    如何获取 64 位 .NET Framework 的 InstallRoot?
    示例:“c:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe”

  4. 64 位系统 CLR 4.0
    如何获取 64 位 .NET Framework 的 InstallRoot?
    示例:“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe”

我实际上不确定 64 位系统上的“InstallRoot”值是否会指向 32 位 .NET 或 64 位 .NET 的 InstallRoot,那么前两种方法对任何系统都可靠吗?第二种方法看起来如何?有没有更简单的方法来实现这一切?

0 投票
1 回答
1508 浏览

.net - 如何使用 Wix 和项目参考部署本机映像 (NGen)

我正在使用 Wix/Votive 为我的 .NET 解决方案构建安装程序。我使用项目引用(heat.exe我认为在内部使用)包含来自其他项目(EXE 和 DLL)的二进制文件。

我现在要做的是,ngen.exe在安装过程中预jit所有程序集。根据 Wix 帮助,这可以通过WiX .NET 扩展库来完成:

现在的问题是,<File />标签是由创建的heat.exe,我不知道如何建议在内部heat.exe生成<NativeImage />标签或如何引用生成的标签并在外部<File />附加标签。<NativeImage />

现在,我看到的唯一方法是不使用项目引用,但显然我想保留它们。

有什么建议么?谢谢!

0 投票
1 回答
2015 浏览

.net - 如何在我的系统上安装 ngen .net dll 以避免为调试进行 JIT 优化?

我安装了 .net 4.0 框架,需要从 3.5 生成 dll 的本机映像而无需优化,以便更轻松地调试它。

我尝试了几种不同的方法:

  1. 转到我的 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0

使用以下命令创建 System.Workflow.Activities.ini:

ngen.exe 卸载 System.Core.dll

[.NET Framework 调试控件] GenerateTrackingInfo=1 AllowOptimize=0

并运行 ngen.exe 卸载 System.Workflow.Activities.dll ngen.exe install System.Workflow.Activities.dll /Debug

现在,当我转到 C:\Windows\Assembly 时,我看到安装的版本是 MSIL,而不是 AMD64。

  1. 我还尝试去 C:\Windows\assembly\GAC_MSIL 并在那里运行 NGEN。

再一次,不去了。

关于做什么的任何想法?

0 投票
5 回答
11256 浏览

.net - JIT 与 NGen - 有什么区别?

因此,当 CLR 运行时加载 .NET 程序集时,它会将其编译为机器本机代码。这个过程称为 JITing。NGen 也是将 .NET 程序集编译为本机代码的过程。我不明白两者有什么区别?

0 投票
1 回答
1020 浏览

wix - 如何以提升的权限从 WiX 运行 ngen?

我正在尝试使用本文ngen将其包含到我的安装程序中。我想在安装期间同步运行(优先级=0),但它需要管理权限才能运行。所以,现在我在日志中有以下消息:ngen

当 ngen 启动时,此时是否有简单的方法向用户询问管理权限(使用标准 UAC 提示符)?如果用户按“否”,我想在没有 ngen 的情况下继续。如果是 - 运行 ngen 并预编译我的应用程序。有什么想法吗?

谢谢。

0 投票
5 回答
15436 浏览

c# - 执行 Ngen 后在哪里可以找到生成文件的位置?

我在 C# 可执行文件上做了 Ngen。它是成功的,但我无法弄清楚生成的文件在我的电脑中的位置。MSDN 说它应该在本机图像缓存中,仍然无法弄清楚它在哪里..

编辑:我想在它上面运行 objdump,因此我需要物理文件

EDIT2:我运行 ngen 的输入是:

0 投票
2 回答
2129 浏览

.net - 测量 .NET 应用程序的 JIT 时间

我知道您可以使用NGen制作 .NET 应用程序的本地预编译映像。

但是您如何衡量您的应用程序在 JIT 中花费了多少时间?哪些分析工具将对此进行测量?有没有免费的工具可以做到这一点?我想知道在这样做之前要节省多少时间。

0 投票
1 回答
13712 浏览

c# - TargetedPatchingOptOut:“跨 NGen 图像边界内联的性能至关重要”?

使用反射器浏览了一些框架类,并注意到许多方法和属性具有以下属性

我很确定我在其他地方也看到了上述评论,但从未跟进。

有人可以告诉我这在 C# 和任何其他上下文中意味着什么吗?

0 投票
6 回答
26542 浏览

.net - 如何杀死 mscorsvw.exe

mscorsvw.exe(预编译程序集的 .NET 优化)占用了我的 CPU 的很大一部分 - 50-100%。

这篇文章(和许多其他文章)说

ngen.exe 执行queueditems

从命令行应该杀死它。对我来说,该命令只是挂起。有没有更好的方法来杀死这个过程?

我没有尝试重新启动。在过去的几天里,我不止一次看到我的 CPU 利用率飙升,我怀疑这是我的问题;我想知道如何杀死它。

0 投票
1 回答
1348 浏览

.net - ngen 和分析

我正在尝试使用 NGen 来查看我的应用程序的本机映像是否比 .NET 运行得更好。但是,我在弄清楚该怎么做时遇到了一些麻烦。

我的应用程序名为MyApp.exe,它有几个依赖 DLL。

我打开 VS 2010 命令提示符并运行:

命令输出未表明遇到任何问题。

然后我去 C:\Windows\assembly 尝试运行 EXE,但在那里找不到它(我在 Windows 7 上)。一点点挖掘告诉我使用命令提示符浏览到 C:\Windows\assembly\NativeImages_v4.0.30319_32。我最终能够在那里找到我的 MyApp.ni.exe,但当然无法在资源管理器中打开包含文件夹。

我试图运行程序,它告诉我:

“C:\Windows\assembly\NativeImages_v4.0.30319_32...\MyApp.ni.exe 不是有效的 Win32 应用程序。”

命令输出说访问被拒绝。

我有两个问题:

  1. 我怎样才能运行这个程序,以便我可以执行本机版本。
  2. 我将如何分析它?看起来我无法从 VS2010 分析器中找到该文件夹​​,因为它在资源管理器中看不到。

谢谢。