问题标签 [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 投票
3 回答
2149 浏览

c# - NGen 和 Gacutil 最佳实践

我一直在开发一个 WinForms 应用程序,它有大约 5 个引用的程序集 - 由我们编写,大约 8 个第三方引用的程序集(我们不希望将来更新它们,除非出现严重错误 - Infragistics/DevExpress 组件! )。

我们的启动时间在冷启动时有点太长了,我想知道是否将它们添加到 Gac 并对其进行更新是否是要走的路。

当我们安装到 NGen 缓存中时,它是否也需要在 gac 中?两者之间有什么联系?我应该瞄准哪个?我们有一个 exe,我会做一个 ILMerge,但我不确定这是否适用于我们的场景 - 长篇大论。

此外,是否有可能获得我的 exe 占用了多少内存 - 就像 Java 应用程序一样(比如 Netbeans!)

0 投票
1 回答
933 浏览

.net - .NET 程序集缓存/ngen/jit 图像预热和冷却行为

我有一个通过 C++/CLI 使用 C#.NET 2.0 DLL 构建的输入法 (IME) 程序。由于 IME 总是附加到另一个应用程序,因此 C#.NET DLL 似乎无法避免图像地址变基。

尽管我已应用 ngen 创建该 C#.NET 2.0 DLL 的本机映像并将其安装到全局程序集缓存中,但它并没有太大改善,大约 12 秒。低至 9 秒。在缓慢的 PIII 级 PC 上。

因此,我使用了一个小型应用程序,它在启动时加载 C#.NET DLL 引用的所有组件,以“预热”该 DLL 的本机映像。它可以将加载时间加快到 0.5 秒。

然而,它只工作了一段时间。约30分钟。后来,它似乎又“降温”了。

有什么方法可以控制 GAC 或本机图像的行为始终“热”?这完全是图像地址变基问题吗?

0 投票
2 回答
2117 浏览

.net - 使用 Wix 3.0 的一步一步的 ngen

我们使用 Wix 为我们的 .NET 应用程序构建安装程序,并且正处于移植到 Wix 3.0 的过程中。

我们的应用程序包括几个 .NET 程序集(与 .NET 应用程序一样),安装程序的最后一步是生成这些程序集。这很重要,因为我们的应用程序使用非 ngen'ed 程序集启动大约需要两倍的时间。

不幸的是,生成步骤需要几分钟,我们想给用户一些视觉反馈,说明安装程序仍在工作(至少有一个用户认为安装程序已经崩溃了!)。我们不想只是将 ngening 移到后台,因为这会使初始用户体验变得更糟——我们的应用程序启动起来会很慢。

我们想做的是单独生成程序集,并在每个程序完成时在安装程序中向用户报告(通过消息和进度条)。虽然让 Wix 进行生成很容易,将其移到背景上也很容易,但我们看不到实现我们想要的直接方法。有什么好的想法或技巧吗?

(我们的应用程序与 .NET 2.0 SP1 兼容,因此我们不想依赖 .NET 3+ 中的任何内容来实现这一点。)

0 投票
5 回答
3098 浏览

minidump - 如何调试“ngen”ed 图像的 WER 小型转储

在安装时在 .NET 托管应用程序上执行 ngen 并从应用程序的 Windows 错误报告中检索故障转储时,如何使用它来查看堆栈跟踪、变量等?

以下是与该问题相关的一些背景:我们有一个在安装时生成的 .NET 应用程序。当它由于未处理的 .NET 异常而崩溃时,崩溃被存储在 Windows 错误报告中,并且我能够从 winqual.microsoft.com 下载 minidump.mdmp 文件。

我将 minidump.mdmp 放在包含 .dbg 文件的文件夹中,用于构建崩溃的应用程序,然后双击 minidump.mdmp 以在 VS2008 SP1 的新实例中打开它。我的堆栈跟踪如下所示:

kernel32.dll!RaiseException() + 0x3d 字节
mscorwks.dll!RaiseTheExceptionInternalOnly() + 0x295 字节
mscorwks.dll!JIT_Throw() + 0x130 字节
MyApp.ni.exe!000007feee74c84c()
[下面的帧可能不正确和/或丢失,没有为 MyApp.ni.exe 加载符号]
0000000070000d5e()
MyApp.ni.exe!000007feee611000()
000000000300bf78()
000000000300bf60()

Modules 窗口表明已为 OS 和 .NET DLL 加载了符号,但对于应用程序模块,我得到以下信息:

MyApp.exe -> 符号文件中没有本机符号。
MyApp.ni.exe -> 找不到匹配的二进制文件。
MyAppsLibrary.ni.dll -> 找不到匹配的二进制文件。

0 投票
1 回答
778 浏览

.net - 分发预 NGEN 版本的程序集是否有意义?

我从这篇文章中找到了一些关于使用 NGEN 作为安装程序的最后一步的有趣链接。是否有理由在设置时而不是在构建时首选 NGEN 您的程序集?我并不特别关心设置时间,但这似乎是一个不必要的步骤,可以通过我的构建自动化。

0 投票
6 回答
1957 浏览

c# - 如何减少 .net 应用程序的启动和运行时间?

我使用 C# 编写带有 .NET 框架的 Windows 应用程序。如何减少这些应用程序的启动时间?我的应用程序在启动和初始化期间感觉很慢,尤其是在显示初始表单时。

我的应用程序使用 Access (MDB) 数据库来保存数据。在某些表单中,它会加载数据,但应用程序第一次显示任何给定的表单时,需要很长时间才能显示。

我尝试使用 NGen 来减少启动时间,但它并没有像预期的那样帮助我。

0 投票
2 回答
3662 浏览

.net - 如何确定装配是否已被 ngen'd?

您如何确定特定的 .Net 程序集是否已经被生成?我需要从代码中检查。即使调用命令行也可以。目前我看不到任何确定这一点的方法。

0 投票
3 回答
5375 浏览

.net - 确定是否正在使用 GAC 和 NGen 的程序集

我如何确定是否正在使用本机图像,而加载程序没有在运行时验证程序集的签名,甚至使用 GAC 的程序集?

我有一个复杂的系统,我们正在用 NGen 进行试验,但目前我们正在从所有 DLL 所在的文件夹中运行 exe,因为有很多后期绑定依赖项,查看 Process Explorer,看起来本机图像正在使用过,但我怎样才能确定我得到了全部好处并消除了加载程序验证步骤?

干杯,格雷姆。

更新: 我从程序集绑定日志查看器中得到了很多这样的东西:

最后

所以它使用的是本机图像,但仍在验证它们,即不使用 GAC 版本,即使那是我创建本机图像的地方,就像这样:

脚注: 这篇文章似乎暗示如果程序集不是从 GAC 加载的,那么验证过程会抵消 NGen 的优势吗? CLR 由内而外 - 提高应用程序启动性能 (MSDN)

更新- 正如 Nobugz 在下面的评论中指出的那样,自 3.5 SP1 以来未执行上述验证步骤,请参阅:MSDN Docs on NGen

0 投票
4 回答
3249 浏览

.net - 捆绑 .NET dll 以在 .NET-less 机器上运行应用程序?

AFAIK,ngen将 MSIL 转换为本机代码(也称为 pre-JIT),但我从未过多关注它对启动性能的影响。Ngen 的应用程序仍然需要 .NET基类库(运行时)。

由于基类库拥有我们的 .NET 程序集所需的一切(对吗?),是否可以将框架的 DLL 与我的 ngen 应用程序一起提供,以便它不需要安装运行时?(例如,大多数 Windows XP 机器的场景)

哦,请不要提及Remotesoft 的 Salamander Linker或Xenocode的 Postbuild。它们不适合我(和许多人)当前的预算(而且它们似乎只是将框架捆绑在虚拟化环境中,这意味着我认为下载量很大并且启动时间很慢)

编辑:
我现在知道,ngen 并没有像我想象的那样做。
但是是否可以在不使用 VM 的情况下将 .NET 文件与应用程序捆绑在一起?

0 投票
4 回答
184 浏览

.net - 防止 .NET 中的动态链接

我想部署一个附加了许可证的应用程序。但是,我想防止我的 dll 在 Visual Studio 中被轻松引用。

这样做的通常方法是什么?我正在考虑对应用程序进行更新以防止这种情况发生,但是,代码变得依赖于体系结构。我没有针对除 Windows 之外的任何其他架构/平台,但是,在发布构建后对应用程序进行 ngen-ing 对我来说似乎是一种解决方法。有没有其他技术可以实现这一目标?