问题标签 [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 回答
3428 浏览

c# - 具有程序集依赖项的 NGen 错误

我有一个显然不是新问题,但我似乎仍然找不到答案的问题。

我正在使用 Google 的 Analytics API for .NET,并且在尝试让程序集很好地协同工作时遇到了困难。通过 Visual Studio 2012 构建时,我没有遇到任何构建错误。但是,当我开始使用 NGen 预编译项目时,我看到很多错误的程序集引用。

我正在使用 MVC 4、Visual Studio 2012 和最新的 Google.Apis 包(截至目前为 1.5.0.1-beta)。

我在相关项目中安装的 .dll / 版本是:

以下是我在 NGen 的输出中发现的错误:

Failed to load dependency System.Net.Http.Primitives of assembly Google.Apis, Version=1.4.0.28227, Culture=neutral, PublicKeyToken=null because of the following error : The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Failed to load dependency System.Web.Mvc of assembly DotNetOpenAuth, Version=4.0.0.11165, Culture=neutral, PublicKeyToken=2780ccd10d57b246 because of the following error : The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Failed to load dependency log4net of assembly DotNetOpenAuth, Version=4.0.0.11165, Culture=neutral, PublicKeyToken=2780ccd10d57b246 because of the following error : The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

这是我在该项目的 web.config 中的内容:

我相信其中大部分是在我使用 NuGet 安装 Google.Apis 包时构建的,但我不明白为什么程序集绑定重定向不能防止 NGen 出现这些错误。

如果有人能帮助我指出正确的方向,我将不胜感激!谢谢!

0 投票
1 回答
2970 浏览

c# - Ngen 错误,因为“Mscorlib.dll 没有本机映像”(仅限 x64,仅限 .NET 4.0)

我正在尝试使用 64 位 Windows 7使用Ngen生成我的 .NET 4.0 应用程序的本机映像。当Platform设置为 x64(或Any CPU)时 - Ngen 失败,抱怨' NGen 无法继续,因为 Mscorlib.dll没有原生图像

当编译为 x86 并使用适当的 Ngen - 它工作正常。此外,将 .NET 版本更改为 2.0 时,它可以工作。(当尝试使用 x86 Ngen 对 x64 应用程序进行 Ngen 时,它告诉我应该使用 64 位版本。)

更多信息

这是我在 CMD 中看到的(部分)内容:省略号 (= ...) 出现在原始文件中。

1> 编译程序集mscorlib , Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 (CLR v4.0.30319) ...

1> mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089

.

2> 编译程序集 Accessibility,Version=4.0.0.0,Culture=neutral,Public KeyToken=b03f5f7f11d50a3a (CLR v4.0.30319) ...

.

2>Ngen 无法为图像可访问性生成本机代码,版本=4.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a,因为以下错误:NGen 无法继续,因为 Mscorlib.dll 没有本机图像(来自 HRESULT 的异常:0x80131F06 )

在里面搜索C:\Windows\assembly我发现了 3 个mscorlib.dll。一进GAC_32一进GAC_64(都在以 2.0.0.0 开头的子文件夹中)和一个在子文件夹temp中。

在内部搜索时,C:\Windows\Microsoft.NET我发现了其中六个:两个在assembly(在GAC's3264中)都在以 'v4.0...' 开头的文件夹中,四个在Framework's: Framework 中的 2 个Framework64中的两个(在每个 -一个在“v2.0 ...”中,一个在“v4.0 ...”中)。

这是否意味着只有 .NET 2.0 mscorlib 真正作为本机映像运行(在需要时)?为什么 Ngen 不能成功保存 .NET 4.0 的本机映像?

底线:如何创建面向 x64 的 .NET 4.0 应用程序的本机映像?

0 投票
2 回答
8581 浏览

.net - 如何在不匹配 IL 程序集的情况下卸载使用 ngen 生成的较旧的 .net 本机映像?

在开发应用程序时,我一直在运行“ngen install ...”。但是在覆盖这些程序集之前,还没有在某些版本/场景(调试等)上运行“ngen uninstall ...”。现在我在“C:\Windows\assembly\NativeImages_v4.0.30319_64\AssemblyName\hashkey”形式的文件夹中看到了许多 *.ni.exe 和 *.ni.dll。(dll也是内部开发的。)

我正在使用.Net 4。

反正有卸载这些吗?我已经尝试过“ngen update”,它似乎没有触及这些孤立的原生图像。当然,我可以手动删除这些,但它会扰乱我的程序集所依赖的系统 dll 上的引用计数,或者对 .net 系统产生更严重的后果。

除了占用空间之外,这些旧程序集还会损害启动延迟,因为程序集绑定程序试图将当前 IL 与每个本机程序集匹配。

还有比使用命令行更好的方法来查看本机图像缓存中的内容吗?

谢谢

0 投票
1 回答
631 浏览

c# - 如何在 ngen 期间调试 TypeLoadException

情况

我正在使用 ngen 在安装过程中创建我的程序集的本机映像。直到最近这才正常工作,我不知道是什么破坏了它。遗憾的是,ngen 输出并不是很有帮助。它只是说它找不到或加载一个类型,但没有说是哪种类型。

非常奇怪的是,只有当我的程序集是使用 msbuild 构建的(由 TFS Team Build 或我在命令行中运行)时,ngen 才会失败,但如果我使用 Visual Studio 2010 构建它,ngen 工作正常!我已经从 .NET 4.0(我的本地机器)、.NET 4.5(TFS 2012 Update 3)和 .NET 4.5.1(TFS 2013)尝试了 msbuild,都在 ngen 中导致了相同的错误。它只是 Visual Studio 2010 GUI 中的构建有效。但是该错误仅发生在 ngen 中,运行时行为是相同的 - 它回退到 IL 程序集,但工作正常。

我什至尝试调试 ngen.exe 和 mscorsvw.exe,但我只能看到一些本机异常被抛出,其中之一是 EETypeLoadException,但我无法获得有关异常的其他信息。但是在调试本机应用程序时,我一点经验都没有。

问题

有谁知道我如何获得有关 ngen 错误的更多信息?导致错误的类型的名称会很好。

我已经在某处读到 Visual Studio 不只是调用 msbuild 进行构建,但为什么会有这么大的差异?

附加信息

TFS 在自动构建期间运行 msbuild。没有配置额外的 msbuild 参数,并且构建过程模板是 TFS 2012 Update 3 中的默认模板。

当我自己运行 msbuild 时,我在 Visual Studio 中也使用的同一文件和文件夹上使用以下命令。配置和平台也是 Visual Studio 中的活动并在 TFS 构建中选择。

ngen 错误发生在我测试的所有机器上,所以它不是我的安装所特有的。

这是完整的 ngen 输出,即使使用了详细开关:

0 投票
0 回答
7058 浏览

java - Dalvik VM 和 ART 运行时有什么区别?

自第一个 Android 版本以来,Dalvik VM 一直是默认 VM。

Google 在 KitKat 4.4 中发布了新的 ART 运行时。

AndroidPolice表示它将提高应用程序的性能和电池寿命。不幸的是,几乎没有关于 ART 的技术信息。只有这一页

据我了解,Dalvik VM 在运行时将 dex 字节码转换为机器指令。ART 将 dex 代码预编译为本机指令,因此它消除了运行时翻译步骤。

对此:

  • 我的理解准确吗?
  • 如果 ART 将 dex 字节码编译成 native,那么 Garbage Collector 会发生什么?
  • ART 背后的想法在某种程度上类似于微软的 NGEN 吗?
  • ART 将如何影响应用程序调试?
0 投票
1 回答
103 浏览

c# - c#中java -server和ngen的区别

当比较运行带有 -server 标志的 jar 和已通过 ngen.exe 运行的 .net 程序集的 Java 时,您会说的关键区别似乎他们正试图为不同的运行时做同样的事情。

0 投票
1 回答
30963 浏览

c# - 如何使用 ngen.exe 进行编译以及如何运行生成的本机代码?

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

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

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

0 投票
1 回答
105 浏览

.net - 计算使用 NGEN 时节省的工作空间

我目前正在尝试计算 NGEN 是否会对我们的 .NET 客户端在 Citrix 场上运行时节省内存方面有任何好处。

我的主要参考是以下文章:

本文建议使用 VMMap 我只需要检查我的可共享 WS 是否增加并且我是金子。

事实上,我确实看到可共享的 WS 增加了大约 56MB(请参阅之前和之后的图片)。但我也注意到,总 WS 也上升了。也许是由于 NGEN 图像的尺寸增加了?

所以我认为我需要考虑到这一点,实际上我的情况要差几兆。

但后来我也明白,由于没有发生 JIT,我在那里节省了一些空间。我相信 JIT 会出现在私有数据下。

我将其计算为: - [Δ Image ShareableWS] + ([Δ Image PrivateWS] - [ΔPrivate Data Total WS])

使用下图:

  • 56.3 + (-58.3 - -6.8) = 节省 4.8MB(每个后续进程)

所以我想问题是——我这样做对吗?我在这里有什么遗漏或没有考虑到的吗?

在 NGEN 之前

在 NGEN 之前

NGEN之后

NGEN之后

0 投票
4 回答
32168 浏览

ngen - ngen.exe 如何以及何时工作?

我想知道预 JIT 编译 (ngen.exe) 的好处。本机图像生成器(NGen) 进程的作用是什么,为什么需要它?

请举个例子。

0 投票
1 回答
169 浏览

nuget - 是否建议将来自 nuget 的程序集(如 Microsoft.Bcl.Async)添加到 GAC 并生成它们?

通过在 GAC 中使用大多数程序集,可以提高启动性能,但无论出于何种原因,我都没有遇到过这样做的建议?