缺少.NET运行时优化服务

缺少.NET运行时优化服务,.net,ngen,.net,Ngen,我目前正在开发的软件,我想在软件安装时,它可以在后台为软件创建本机映像 我正在考虑使用NGEN,并将进程优先级设置为低,因为我不希望它消耗100%的CPU。但我发现我的计算机上的“服务”中实际上缺少“.NET运行时优化服务”。因此,即使计算机处于“空闲”状态,NGEN也不会继续我的所有过程 我只是想知道有什么方法可以重新注册该服务,或者有什么解决方案吗?不确定您使用的是哪个版本的.net,但是ngen并不总是在您希望部署到的所有Maschine上执行相同的操作 由于这个原因,微软改变了编译器和项

我目前正在开发的软件,我想在软件安装时,它可以在后台为软件创建本机映像

我正在考虑使用NGEN,并将进程优先级设置为低,因为我不希望它消耗100%的CPU。但我发现我的计算机上的“服务”中实际上缺少“.NET运行时优化服务”。因此,即使计算机处于“空闲”状态,NGEN也不会继续我的所有过程


我只是想知道有什么方法可以重新注册该服务,或者有什么解决方案吗?

不确定您使用的是哪个版本的.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();
        }