NGen对我的计算机不满意,我无法找到一种方法来深入了解出了什么问题.
每次启动后,ngen都会记录以下消息:
.NET运行时优化服务(clr_optimization_v2.0.50727_32) - 服务达到了瞬态错误的限制.将关闭.从Service Manager返回的上一个错误:0x8000ffff.
当我尝试在命令行启动优化服务时,我会再次记录相同的错误.
我设法启动了ngen服务并立即暂停队列(通过编写两行批处理文件,如下所示:
net start clr_optimization_v2.0.50727_32
ngen队列暂停
所以现在我尝试通过执行不同状态级别的项目来清除队列,如下所示:
ngen executionqueueditems 3/nologo/verbose
但结果总是:
灾难性故障(HRESULT异常:0x8000FFFF(E_UNEXPECTED))
...沿途我已经卸载/重新安装了visual studio 2008.我已经卸载了SQL Server 2005,并且我运行了'系统文件检查器':sfc/scannow
缺乏想法,并希望得到ngen专家的帮助.
我如何获得诸如"导致这些灾难性故障的原因?"等信息.(请注意,/ verbose选项不会增加我发现的信息量."队列中要生成哪些文件?" - 我可以删除其中的一些文件,或者将责任归咎于特定文件. ..
卸载并重新安装.net framework 2.0并不容易,因为这是vista,它是操作系统的受保护部分.
更新:我也尝试了这里提供的建议(并在第一个回复中提到) - 但我只是得到了相同的灾难性失败消息.
C:\ Windows\Microsoft.NET\Framework\v2.0.50727> ngen executequeueditems/nologo灾难性故障(HRESULT异常:0x8000FFFF(E_UNEXPECTED))
AFAIK,ngen将MSIL转换为本机代码(也称为JIT之前的版本),但是我从未对它的启动性能影响给予太多关注.Ngen'd应用程序仍然需要.NET 基类库(运行时).
由于基类库具有.NET程序集所需的所有内容(正确吗?),是否可以使用我的ngen'd应用程序发布框架的DLL,以便它不需要安装运行时?(例如,大多数Windows XP计算机的方案)
哦,请不要再提及Remotesoft的Salamander Linker或Xenocode 的Postbuild.它们不适用于我(和许多人)目前的预算(他们似乎只是简单地将框架捆绑在一个虚拟化的环境中,这意味着我相信大的下载大小和慢启动时间)
编辑:
我现在知道,ngen并没有按照我的想法去做.
但是可以在不使用VM的情况下将.NET文件与应用程序捆绑在一起吗?
经过大量的搜索,我仍然无法得到问题的解决方案.
我有一个mdmp文件.调用堆栈显示它正在使用mscorlib.ni.dll.因此,要获取函数信息,我需要获取其pdb文件.
mscorlib.ni.dll的版本是2.0.50727.3655.我相信它来自.Net Framework 3.5.
由于mscorlib.ni.dll是由ngen.exe生成的本机优化的dll,因此我需要使用ngen.exe createpdb为此dll生成pdf.
ngen.exe createpdb "C:\Windows\assembly\...\mscorlib.ni.dll" "C:\SymbolCache"
Run Code Online (Sandbox Code Playgroud)
结果如下:
Microsoft(R)CLR Native Image Generator - 版本4.0.30319.18408版权所有(c)Microsoft Corporation.版权所有.在本机映像'C:\ Windows\assembly\NativeImages_v2.0.507 7_64\mscorlib\5cd1c2848ff40eb0a8c149706ee394fa\mscorlib.ni.dll'中找到无效的标头.未指定的错误(来自HRESULT的异常:0x80004005(E_FAIL))
所以我不知道如何获取Net Framework 3.5的mscorlib.ni.dll的pdb.
任何的想法?
我正在尝试使用NGen来查看我的应用程序的本机映像是否比.NET更好.但是,我在弄清楚该怎么做时遇到了一些麻烦.
我的应用程序名为MyApp.exe,它有几个依赖DLL.
我打开了VS 2010命令提示符并运行:
ngen install MyApp.exe /Profile
Run Code Online (Sandbox Code Playgroud)
命令输出未表明遇到任何问题.
然后我去了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应用程序."
命令输出表示Access被拒绝.
我有两个问题:
谢谢.
在.NET 4.6下,Ngen和RyuJIT是两个完全不相关的东西(特别是使用不同的优化技术和算法)?
如果我们不关心自身抖动和/或冷/热启动时间的成本,那么什么产生最快(更好的优化)x64本机代码?
我们正在运行一个长期运行的服务器应用 连续运行阶段在性能方面非常重要.(预)启动阶段对我们来说并不重要.到目前为止,我们已经使用.NET 4.5并且始终由Ngen生成本机映像.我们现在正在升级到.NET 4.6,我们希望确保这不会降低我们持续运行阶段的性能.我已经阅读了一些信息,RyuJIT是改善JITing时间的绝佳选择,但是与Ngen相比,jited代码可能没有那么优化 - 参见例如关于其中一个RyuJIT错误的github评论.
在过去的几周里,我一直在玩非托管的.NET调试API.
虽然MSDN记录了接口本身,但为了找到如何以任何有意义的方式实际使用它们,我使用了各种博客(主要是Mike Stall)和CLR Managed Debugger示例中的托管包装器以及ILSpy源代码.最后,我能够将我的测试程序附加到正在运行的进程,设置断点并点击它们.
我接下来要做的就是点击这样一个断点,读取相关对象实例的一个字段.通过禁用加载NGEN的程序集(环境设置'COMPLUS_ZAPDISABLE = 1')并禁用JIT优化(又称'.ini文件技巧' ),当调试目标方法尚未进行NGEN或JIT时,这可以正常工作).
但是,当我尝试使用我理想的目标 - 零售优化(NGEN/JIT'ed)代码时 - 它不起作用.例如:我可以在命中入口断点时仍然检索方法参数的数量,但我无法获得第一个参数本身(调试API抛出异常).
现在,我想这是因为调试API应该是独立于平台的,在这种情况下,程序集不再存在.但是如果我接受这个平台依赖于英特尔的那个怎么办:据我所知CLR使用fastcall调用约定,在这种情况下,ECX寄存器包含第一个方法参数(成员函数的隐式'this'引用) .
我测试了这个,实际上在击中断点时,ECX包含NGEN的组件中的OBJECTREF(对象实例的地址).
现在,读取实例字段的最后一步是检索相对于此指针的字段偏移量,这就是我被卡住的地方,因为我似乎无法找到CLR如何在本机代码生成期间打包实例字段.
我意识到这可能是CLR版本/实现依赖,但显然有方法,因为带有SOS扩展的WinDbg能够找到这种布局.如果没有通过调试API,我能以某种方式利用SOS.dll吗?
在应用程序开发过程中,我一直在运行"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与每个本机程序集进行匹配.
还有一种更好的方法来查看本机映像缓存中的内容而不是使用命令行吗?
谢谢
经过大量研究,我仍然找不到这个问题的答案。
那么,可以在32位“基本”或“标准”实例中部署在Azure网站中的一个NGEN的ASP.NET MVC3应用程序吗?
谢谢。
下面是这样的情况:我只使用一个<LabeL>显示Hello Word 的简单网格构建一个基本的WPF应用程序!
这是XAML:
<Window x:Class="TestShell.NoCaliburn.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Label VerticalAlignment="Center" HorizontalAlignment="Center">Hello World!</Label>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
在我的机器上,我安装.Net 4.5了,应用程序出现在一秒钟之内.但是在我的同事机器上,应用程序出现在≈10s之后.
注意 此行为仅在WPF中发生
我错过了什么?
我目前正在开发要在安装该软件的同时开发的软件,它可以在后台为该软件创建本机映像。
我正在考虑使用NGEN,并将进程优先级设置为低,因为我不希望它消耗100%的CPU。但是我发现计算机上的“服务”实际上缺少“ .NET运行时优化服务”。因此,即使计算机处于“空闲”状态,NGEN也不会真正继续我的所有过程。
我只是想知道有什么方法可以重新注册服务,或者有什么解决方案吗?