缺少.NET运行时优化服务
我目前正在开发的软件,我想在软件安装时,它可以在后台为软件创建本机映像 我正在考虑使用NGEN,并将进程优先级设置为低,因为我不希望它消耗100%的CPU。但我发现我的计算机上的“服务”中实际上缺少“.NET运行时优化服务”。因此,即使计算机处于“空闲”状态,NGEN也不会继续我的所有过程缺少.NET运行时优化服务,.net,ngen,.net,Ngen,我目前正在开发的软件,我想在软件安装时,它可以在后台为软件创建本机映像 我正在考虑使用NGEN,并将进程优先级设置为低,因为我不希望它消耗100%的CPU。但我发现我的计算机上的“服务”中实际上缺少“.NET运行时优化服务”。因此,即使计算机处于“空闲”状态,NGEN也不会继续我的所有过程 我只是想知道有什么方法可以重新注册该服务,或者有什么解决方案吗?不确定您使用的是哪个版本的.net,但是ngen并不总是在您希望部署到的所有Maschine上执行相同的操作 由于这个原因,微软改变了编译器和项
我只是想知道有什么方法可以重新注册该服务,或者有什么解决方案吗?不确定您使用的是哪个版本的.net,但是ngen并不总是在您希望部署到的所有Maschine上执行相同的操作 由于这个原因,微软改变了编译器和项目结构。从我的项目中的一个小摘录可以看出,这可以看看PublishReadyToRun,因为这个PublishTrimmed做了NGEN以前做的事情,通过将PublishSingleFile设置为true来创建单个文件将有助于您轻松部署,因为它会生成一个巨大的exe并删除所有dll
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<PublishTrimmed>true</PublishTrimmed>
<PublishReadyToRun>true</PublishReadyToRun>
<PublishSingleFile>true</PublishSingleFile>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<TrimmerRootAssembly Include="mscorlib" />
<TrimmerRootAssembly Include="System" />
<TrimmerRootAssembly Include="System.IO" />
<TrimmerRootAssembly Include="System.Threading.Tasks" />
</ItemGroup>
…
</Project>
如果没有返回任何文件,您可以弹出一条消息供用户下载并安装“right sdk”,然后您可以使用ngen.exe的命令行继续执行优化策略
低优先级
以较低线程优先级启动应用程序的一个简单技巧是使用start命令启动应用程序。
我在我的Win10机器上检查了NGEN服务,只找到了
.NET运行时优化服务v2.0.50727_X86
对于旧的.NET 2.0/3.5,.NET 4.x没有服务。但是我在任务调度程序库/Microsoft/Windows/.NET Framework中发现了几个计划任务
这将有助于解决问题。看起来,对于Win8和更高版本,MS开发人员正在使用任务而不是服务来运行排队的本机映像生成
var drainAppStoreQueue = function () {
var schTasks = wsh.ExpandEnvironmentStrings("%windir%\\System32\\schtasks.exe");
var arguments = "/run /Tn \"\\Microsoft\\Windows\\.NET Framework\\.NET Framework NGEN v4.0.30319";
runToCompletion(schTasks, arguments + "\"", true);
if (is64bit)
runToCompletion(schTasks, arguments + " 64\"", true);
}
drainNGenQueue(isV4Installed ? "v4.0.30319" : "v2.0.50727");
if (isOSWin8OrLater) {
drainAppStoreQueue();
}
我已尝试获取x86/x64.NET Framework版本和it报告的ngen服务状态
C:\Windows\Microsoft.NET\Framework\v4.0.30319>ngen队列状态
Microsoft(R)CLR本机映像生成器-版本4.8.3752.0
版权所有(c)微软公司。版权所有
服务名称为:.NET Framework NGEN v4.0.30319.NET运行时
优化服务已停止
据我所知,它将在操作排队等待计划执行时启动。根据ngen,您有两种选择:
ngen安装[assemblyName | assemblyPath]
安装
程序集立即同步(需要一段时间,但
你直接运行它)/queue[:{1 | 2 | 3}]
,以安排图像生成(立即或在空闲时间,取决于优先级)ngen update/queue
来测试上述任务是否正常工作。根据文件
如果指定了/queue,则更新将排队等待本机映像
服务更新总是按优先级3排定,因此在
计算机是空闲的
在我的机器中,此命令将
.NET Framework NGEN v4.0.30319
任务的状态设置为排队,并更新上次运行时。通过调用ngen executequeueeditems
始终可以同步执行所有计划的操作。我们遇到的问题是服务列表中缺少net Optimization runtime服务。因此,如果您将优先级设置为3(空闲),它将永远不会实际运行。ReadyToRun则完全不同。它只在.NET Core 3中使用。我们使用的是NET 471,因此无法使用。电脑中没有缺少ngen本身,只是服务管理器中缺少了在空闲时运行的服务。因此,如果我们使用ngen/queue设置为3(空闲),它将永远不会运行。我们已经将ngen作为低优先级运行,但是如果用户在完成之前关闭电脑,那么我们无法知道。该服务是正确的方法,但是在我们尝试过的几台机器上,该服务似乎未注册。您是否找到解决方案?我将为这个问题添加一个悬赏,这样它可能会引起一些注意。它应该是丢失的。mscorsvw.exe实现的服务由ngen.exe安装命令自动激活。确保完成任务的唯一体面方法是运行ngen.exe队列状态。您使用的是哪个版本的.NET?4.7.1。如果服务丢失,那么队列永远不会执行@HansPassant这意味着队列在某些机器上完全无用。如果您的机器上存在该服务,您可以截图吗?@rolls在我的机器上我只有.NET运行时优化服务v2.0.50727_X86
对于旧的.NET 2.0/3.5版本,对于.NET 4,有两个计划任务任务任务任务,一个计划任务而不是服务。呵呵。从来没有想过这一点(写文档的人也没有想过)。这是我们安装应用程序的大多数机器所缺少的服务。因此,当我们指定/queue时,它们永远不会执行。这些机器都安装了.net 4.7.1。如果.NET Runtime Optimization Service v2.0.50727_X86丢失,则无论您重新启动多少次,/queue都不起作用。您提到的任务似乎也不在这些计算机上运行。@请仔细阅读上面的答案:)。NET Runtime Optimization Service v2.0.50727_X86
仅适用于旧的.NET 2/3.5,它不存在于带有.NET 4的计算机上。NET Framework 4.7.1是对Microsoft.NET Framework 4、4.5、4.5.1、4.5.2、4.6、4.6.1、4.6.2和4.7的就地更新,因为它们共享相同的CLR v4.0.30319运行时。我检查了安装了.NET 4.5和.NET 4.6.2的多台计算机,NGEN任务存在。请通过调用ngen队列状态
和ngen更新/队列
var drainAppStoreQueue = function () {
var schTasks = wsh.ExpandEnvironmentStrings("%windir%\\System32\\schtasks.exe");
var arguments = "/run /Tn \"\\Microsoft\\Windows\\.NET Framework\\.NET Framework NGEN v4.0.30319";
runToCompletion(schTasks, arguments + "\"", true);
if (is64bit)
runToCompletion(schTasks, arguments + " 64\"", true);
}
drainNGenQueue(isV4Installed ? "v4.0.30319" : "v2.0.50727");
if (isOSWin8OrLater) {
drainAppStoreQueue();
}