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

visual-studio-2010 - 未加载 NGEN 的程序集

我正在尝试衡量 NGEN 对我的程序集的性能影响,但我无法让我的可执行文件加载 NGEN 程序集。我从 VS2010 命令提示符运行以下命令:

这完成没有任何问题,并且我验证了我的所有依赖程序集都已在 C:\Windows\assembly\NativeImages_v4.0.30319_32\MyCompanyName# 目录中创建。

然后我启动我的应用程序并查看 Process Explorer,它正在从本地二进制目录加载我的所有程序集,而不是从 NativeImages_x 文件夹加载 *.ni.dll 文件。我使用 fuslogvw 记录了绑定。这是一个示例日志条目:

有人对这里发生的事情有任何想法吗?我验证了有问题的本机程序集存在于:

为什么它没有正确绑定它?FWIW,该应用程序使用了相当多的 MEF;我不知道这是否会影响程序集的加载。

0 投票
2 回答
304 浏览

.net - 本机代码生成

我是 .Net 4.0 中本机代码生成的新手。在我的项目中,单个 EXE 文件总共有 500 多个 DLL 文件。如果我必须使用 ngen.exe install 为所有这些 DLL 创建一个本地映像,这将是一个很大的过程。所以我的问题是是否有任何工具或脚本可以为所有这些 DLL 文件创建本机映像。请帮我解决这个问题。

提前致谢。,

0 投票
4 回答
696 浏览

c# - 使用 ngen.exe 编译内核

我知道 Cosmos 和 SharpOS 已经制作了自己的编译器来从 C# 构建二进制代码,但是您可以使用 Microsoft 的 .NET AOT 来做同样的事情吗?将 C# 编译为 x86,即。我假设您必须省略 using 语句,就像操作系统开发中包含语句一样。任何反馈表示赞赏。谢谢

编辑:我想在内核开发中使用 C# 的主要原因是托管代码带来的内存管理,尤其是单个地址空间属性。是否有必要启动 JIT 编译器,然后编译 C#?还是那个时候环境仍然太残缺?感谢您的反馈

0 投票
1 回答
660 浏览

.net - 检查/反汇编 .Net 原生图像

是否可以反汇编/检查 .Net JITer / ngen 生成的本机代码?(纯学术目的)

在试图回答这个问题时,我对 JITer 将执行什么样的优化产生了兴趣——而不是疯狂地推测,我真的很想亲眼看看真正发生了什么。

到目前为止,我已经:

  1. 使用ngen安装了我的候选程序集的本机映像(此输出可能与 JIT 编译器的输出不同吗?)
  2. 从 GAC 中复制原生镜像

但现在我有点卡住了——据我所知.Net程序集是可移植的可执行格式,但我可能用来反汇编这样一个文件(objdump)的普通工具只是barf:

以这种方式窥视原生图像是否可行?如果做不到这一点,是否有其他方法可以满足我的好奇心?(例如反汇编正在运行的进程中的代码)

0 投票
1 回答
400 浏览

.net - 如何减少在网络上运行的 .Net dll 的数量

我们有一个带有大量 .dll 文件的 .Net framework 4 软件解决方案。

这些文件托管在网络服务器上,并从公共远程文件夹上的客户端运行。

我们希望减少此服务器文件夹中 .dll 文件的数量。

确实会出现一些问题:

  • 合并后的 .dll 是否会比许多较小的 .dll 更慢/更快地启动/或执行?
  • 在网络库文件上使用 NGen 是否有好处,以便为每个客户端优化它?

大多数这些 .dll 实际上是通过 COM 可见接口从 32 位非托管代码调用的。

0 投票
1 回答
1523 浏览

c# - 使用 ngen.exe 创建和分发本机映像

我尝试使用ngen.exe从 CIL 二进制文件中获取本机图像。 该站点解释说,%WINDIR%\assembly例如,当我执行 ngen 命令时,我可以获取本机映像ngen install abc.exe,但我在计算机中找不到。我使用 VS2010 的 Windows 7 64 位。

  • 运行 ngen 后在哪里/如何找到本机映像?
  • 我可以分发本机映像而不是 CIL 二进制文件吗?
0 投票
2 回答
2174 浏览

.net - 我们可以拆卸(使用 ILDasm)一个 NGen-ed 程序集吗?

如果我NGen一个组件,ildasm仍然拆卸它是否正常?

行。我写了一个 HelloWorld 类库,随后的 dll 被命名为 NGenILDasmTest.dll。--> 针对 .Net fw 4。

从 Vs 2010 命令提示符,我做到了

我可以看到安装在 GAC 中的程序集。我运行了 ildasm 以便查看 IL。到现在为止还挺好。

然后我跑

(我没有为 ngen 指定任何选项)。这个程序集成功编译。我在文件夹下找到了一个名为 NGenILDasmTest.ni.dll 的文件

现在,当我像下面那样运行 ildasm

我可以看到 Ngen-ed 程序集的内容。这是正常的吗?。

从技术上讲,Ngen 为 IL 生成本机 CPU 指令(显然将其放在 C:\windows\Assembly\NativeImages_V4.#####_32 下 - 在我的情况下)。如果是这种情况,我如何仍然能够使用 ILDasm 将 NGen-ed 程序集视为 IL?

请帮助我理解我在这里缺少的“小东西”。

0 投票
2 回答
2035 浏览

c# - dll基址

我有一个带有一个 exe 和三个 Dll 的小型测试解决方案,该 exe 分别调用三个 Dll 一次。我已将Dll1.dll、Dll2.dll 和 Dll3.dll 的 Build- >Advanced->DLL Base Address设置分别设置为 0x41000000、0x42000000 和 0x43000000。我跑了

这已经成功地将应用程序与三个 Dll 一起生成。我真的不想生成 exe,但到目前为止,这是产生任何结果的唯一方法。

在运行时,我使用 VMMap 监视虚拟地址空间,它显示 ngen 的 Dll 位于一致的虚拟内存范围内,但是它们仍在该范围内跳跃,每次我运行时加载的地址都略有不同他们。VMMap 显示在我尝试加载图像的地址上没有分配任何内容,因此这种跳跃行为不是由地址冲突引起的。

我一直在记录日志:

请注意,地址的前两位数字在所有运行中对于所有三个 Dll 保持一致。

我的实际问题是:这是成功的指标吗?我有点困惑,因为我认为 Dll 将恰好位于 0x41000000、0x42000000 和 0x43000000。结果表明他们在那个区域徘徊,但从未真正坐在我让他们坐的地方。我的理解是,您希望将 Dll 准确地加载到您要求它们加载的地址,这样它们就不必进行昂贵的变基操作(当您的 Dll 被 ngen'd 时,这非常昂贵)但是,这不正是正在发生的事情吗?当然,我的 Dll 在某个区域徘徊,但它们并没有完全坐在我要求它们坐的位置,所以每次运行时肯定会执行昂贵的变基操作吗?这正是我想要避免的。

注意:我对支持/反对 rebase 和 ngen 的论点不感兴趣。我只想知道发生了什么以及如何让它工作。

干杯!

0 投票
1 回答
2510 浏览

.net - NGen 错误未能加载运行时错误

在使用 .NET Framework 4 中的 NGen 编译一堆 DLL 程序集时,我遇到了一个奇怪的错误。该安装适用于某些 DLL,但对于其他一些 DLL,它会产生以下错误消息:

无法加载运行时。(来自 HRESULT 的异常:0x80131700)。程序集AseemblyFileLocation需要运行时版本 v4.0.30319 才能运行。安装正确的运行时后将编译程序集。

我确定我有正确的运行时版本。当我尝试在网上搜索答案时,我发现没有人遇到过这个问题,这更奇怪。

有这方面的线索吗?谢谢。

0 投票
2 回答
742 浏览

visual-studio - 一旦使用“ngen install ... /profile”,IntelliTrace 将无法正常工作

我们正在开发一个应用程序,它极大地受益于 .NET 框架的 Profiled Native Images。因此,在我们的安装过程中,我们在几个 .NET 程序集上运行以下命令:

ngen install "ASSEMBLY NAME" /Profile

在部署我们的应用程序后不久,我们就收到了用户在 Visual Studio 2010 中的 IntelliTrace 功能停止工作的投诉。经过短暂调查后,我们发现一旦有 mscorlib.dll 的Profiling Native Image,IntelliTrace 就会停止工作。此外,当它发生时,我们会在事件查看器中收到以下消息:

TraceLog Profiler 检测到加载到进程中的 NGEN /profile 程序集。不支持此类程序集。收集将被禁用。

这尤其令人不安,因为 mscorlib.dll 是任何其他 .NET 程序集的依赖项,这意味着ngen install ... /profile在任何程序集上使用也会导致生成 mscorlib.dll。

以下是该问题的简单再现:

  1. 创建一个新的控制台应用程序,将其目标框架设置为 .NET 2。添加图像中显示的代码并在 SomeFunction 之后设置断点。 示例代码

  2. 将 IntelliTrace 设置为“IntelliTrace 事件和呼叫信息”

  3. 开始调试。一旦断点被​​击中,您应该得到以下正确的 IntelliTrace: 正确的 IntelliTrace

  4. 停止调试并退出 Visual Studio。

  5. 以提升模式打开新的 cmd.exe
  6. 执行: %windir%\Microsoft.NET\Framework\v2.0.50727\ngen install "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
  7. 再次启动 Visual Studio 并开始调试。将命中相同的断点。但是,这一次 IntelliTrace 将如下所示: 损坏的 IntelliTrace
  8. 要使 IntelliTrace 在同一 cmd 窗口中再次运行:

%windir%\Microsoft.NET\Framework\v2.0.50727\ngen uninstall "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile

我们还尝试使用ngen.exe 的/NoDependencies标志来仅添加特定程序集,而不添加 mscorlib,但是,似乎该标志被忽略 - 即使我们已经执行ngen install ... /Profile /NoDependencies,依赖项已安装:运行ngen display | find "<profiling>"显示 mscorlib即使使用了 /NoDependencies 标志,仍然安装。

问题

  1. 有没有办法 NGEN 卸载 mscorlib /profile,即使安装了其他 ngen /profile 程序集?
  2. 执行 NGen /Profile 后,是否有使 IntelliTrace 正常工作的解决方法?
  3. 为什么 /NoDependencies 标志没有按预期工作?

谢谢你,维塔利贝尔曼