Ngen.exe (генератор образов в машинном коде)Ngen.exe (Native Image Generator)

Генератор образов в машинном коде (Ngen.exe) — это средство повышения быстродействия управляемых приложений.The Native Image Generator (Ngen.exe) is a tool that improves the performance of managed applications. Программа Ngen.exe создает образы в машинном коде, представляющие собой файлы, содержащие компилированный, специфический для процессора машинный код, и устанавливает их в кэш образов в машинном коде на локальном компьютере.Ngen.exe creates native images, which are files containing compiled processor-specific machine code, and installs them into the native image cache on the local computer. Среда выполнения может использовать образы в машинном коде, находящиеся в кэше, вместо использования JIT-компилятора для компиляции исходной сборки.The runtime can use native images from the cache instead of using the just-in-time (JIT) compiler to compile the original assembly.

Изменения в программе NGen.exe для .NET Framework 4:Changes to Ngen.exe in the .NET Framework 4:

  • Теперь программа NGen.exe компилирует сборки с полным доверием, и политика разграничения доступа кода (CAS) больше не вычисляется.Ngen.exe now compiles assemblies with full trust, and code access security (CAS) policy is no longer evaluated.

  • Образы в машинном коде, созданные с помощью NGen.exe, нельзя загружать в приложения, выполняющиеся в режиме частичного доверия.Native images that are generated with Ngen.exe can no longer be loaded into applications that are running in partial trust.

Изменения в программе NGen.exe для .NET Framework версии 2.0.Changes to Ngen.exe in the .NET Framework version 2.0:

  • При установке сборки также устанавливаются ее зависимости, что упрощает синтаксис Ngen.exe.Installing an assembly also installs its dependencies, simplifying the syntax of Ngen.exe.

  • Образы в машинном коде теперь могут использоваться совместно в различных доменах приложений.Native images can now be shared across application domains.

  • Новое действие, update, заново создает образы, ставшие недействительными.A new action, update, re-creates images that have been invalidated.

  • Служба может отложить выполнение действий, используя для создания и установки образов время простоя компьютера.Actions can be deferred for execution by a service that uses idle time on the computer to generate and install images.

  • Были устранены некоторые причины недействительности образов.Some causes of image invalidation have been eliminated.

Для Windows 8 см. раздел Задача образов в машинном коде.On Windows 8, see Native Image Task.

Подробнее об использовании программы Ngen.exe и службы образов в машинном коде см. в разделе Служба образов в машинном коде.For additional information on using Ngen.exe and the native image service, see Native Image Service.

Примечание

Синтаксис Ngen.exe для .NET Framework версий 1.0 и 1.1 см. в разделе Генератор образов в машинном коде (Ngen.exe), традиционный синтаксис.Ngen.exe syntax for versions 1.0 and 1.1 of the .NET Framework can be found in Native Image Generator (Ngen.exe) Legacy Syntax.

Эта программа автоматически устанавливается вместе с Visual Studio.This tool is automatically installed with Visual Studio. Чтобы применить этот инструмент, воспользуйтесь командной строкой разработчика для Visual Studio (или командной строкой Visual Studio в Windows 7).To run the tool, use the Developer Command Prompt for Visual Studio (or the Visual Studio Command Prompt in Windows 7). Дополнительные сведения см. в разделе Командные строки.For more information, see Command Prompts.

В командной строке введите следующее.At the command prompt, type the following:

СинтаксисSyntax

ngen action [options]
ngen /? | /help

ДействияActions

В следующей таблице показан синтаксис каждого из действий action.The following table shows the syntax of each action. Описания отдельных частей параметра action см. в таблицах Аргументы, Уровни приоритета, Сценарии и Конфигурации.For descriptions of the individual parts of an action, see the Arguments, Priority Levels, Scenarios, and Config tables. В таблице Параметры описываются параметр options и ключи справки.The Options table describes the options and the help switches.

ДействиеAction ОПИСАНИЕDescription
install [assemblyName | assemblyPath] [scenarios] [config] [/queue[:{1|2|3}]]install [assemblyName | assemblyPath] [scenarios] [config] [/queue[:{1|2|3}]] Формирует образы в машинном коде для сборки и ее зависимостей, а затем устанавливает образы в кэш образов в машинном коде.Generate native images for an assembly and its dependencies and install the images in the native image cache.

Если задан ключ /queue, действие помещается в очередь службы образов в машинном коде.If /queue is specified, the action is queued for the native image service. Приоритет по умолчанию равен 3.The default priority is 3. См. таблицу Уровни приоритета.See the Priority Levels table.
uninstall [assemblyName | assemblyPath] [scenarios] [config]uninstall [assemblyName | assemblyPath] [scenarios] [config] Удаляет образы в машинном коде для сборки и ее зависимостей из кэша образов в машинном коде.Delete the native images of an assembly and its dependencies from the native image cache.

Для удаления одного образа и его зависимостей используются те же аргументы командной строки, что и для установки образа.To uninstall a single image and its dependencies, use the same command-line arguments that were used to install the image. Примечание. Начиная с .NET Framework 4, действие uninstall * не поддерживается.Note: Starting with the .NET Framework 4, the action uninstall * is no longer supported.
update [/queue]update [/queue] Обновляет образы в машинном коде, ставшие недействительными.Update native images that have become invalid.

Если указан ключ /queue, обновления помещаются в очередь службы образов в машинном коде.If /queue is specified, the updates are queued for the native image service. Обновления всегда планируются с приоритетом 3, поэтому они выполняются во время простоя компьютера.Updates are always scheduled at priority 3, so they run when the computer is idle.
display [assemblyName | assemblyPath]display [assemblyName | assemblyPath] Отображает состояние образов в машинном коде для сборки и ее зависимостей.Display the state of the native images for an assembly and its dependencies.

Если аргумент не указан, отображается все содержимое кэша образов в машинном коде.If no argument is supplied, everything in the native image cache is displayed.
executeQueuedItems [1|2|3]executeQueuedItems [1|2|3]

-или--or-

eqi [1|2|3]eqi [1|2|3]
Выполняет поставленные в очередь задания компиляции.Execute queued compilation jobs.

Если указан приоритет, выполняются задания компиляции с большим или равным приоритетом.If a priority is specified, compilation jobs with greater or equal priority are executed. Если приоритет не задан, выполняются все поставленные в очередь задания компиляции.If no priority is specified, all queued compilation jobs are executed.
queue {pause | continue | status}queue {pause | continue | status} Приостанавливает работу службы образов в машинном коде, разрешает продолжение выполнения приостановленной службы или запрашивает состояние службы.Pause the native image service, allow the paused service to continue, or query the status of the service.

АргументыArguments

АргументArgument ОПИСАНИЕDescription
assemblyName Полное отображаемое имя сборки.The full display name of the assembly. Например, "myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5".For example, "myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5". Примечание. Для действий myAssembly и display разработчик может предоставить имя частичной сборки, например uninstall.Note: You can supply a partial assembly name, such as myAssembly, for the display and uninstall actions.

В командной строке программы Ngen.exe может быть указана только одна сборка.Only one assembly can be specified per Ngen.exe command line.
assemblyPath Явный путь для сборки.The explicit path of the assembly. Можно указать полный или относительный путь.You can specify a full or relative path.

Если имя файла задано без пути, сборка должна находиться в текущем каталоге.If you specify a file name without a path, the assembly must be located in the current directory.

В командной строке программы Ngen.exe может быть указана только одна сборка.Only one assembly can be specified per Ngen.exe command line.

Уровни приоритетаPriority Levels

ПриоритетPriority ОПИСАНИЕDescription
1 Образы в машинном коде создаются и устанавливаются немедленно, не дожидаясь периода простоя.Native images are generated and installed immediately, without waiting for idle time.
2 Образы в машинном коде генерируются и устанавливаются, не дожидаясь периода простоя, но после завершения всех действий и их зависимостей действий с приоритетом 1.Native images are generated and installed without waiting for idle time, but after all priority 1 actions (and their dependencies) have completed.
3 Образы в машинном коде устанавливаются, когда служба образов в машинном коде обнаружит, что компьютер находится в режиме простоя.Native images are installed when the native image service detects that the computer is idle. См. раздел Служба образов в машинном коде.See Native Image Service.

СценарииScenarios

СценарийScenario ОПИСАНИЕDescription
/Debug Создает образы в машинном коде, которые можно использовать с отладчиком.Generate native images that can be used under a debugger.
/Profile Создает образы в машинном коде, которые можно использовать с профилировщиком.Generate native images that can be used under a profiler.
/NoDependencies Создает минимальное число образов в машинном коде, которое требуется в соответствии с параметрами конкретного сценария.Generate the minimum number of native images required by the specified scenario options.

ConfigConfig

КонфигурацияConfiguration ОПИСАНИЕDescription
/ExeConfig: exePath/ExeConfig: exePath Используется конфигурация указанной исполняемой сборки.Use the configuration of the specified executable assembly.

При привязке к зависимостям программа Ngen.exe должна принимать те же решения, что и загрузчик.Ngen.exe needs to make the same decisions as the loader when binding to dependencies. Когда общий компонент загружается во время выполнения с помощью метода Load, файл конфигурации приложения определяет зависимости, загруженные для общего компонента, например версию загруженной зависимости.When a shared component is loaded at run time, using the Load method, the application's configuration file determines the dependencies that are loaded for the shared component — for example, the version of a dependency that is loaded. Ключ /ExeConfig указывает программе Ngen.exe, какие зависимости будут загружаться во время выполнения.The /ExeConfig switch gives Ngen.exe guidance on which dependencies would be loaded at run time.
/AppBase: directoryPath/AppBase: directoryPath При обнаружении зависимостей используйте указанный каталог в качестве базовой папки приложения.When locating dependencies, use the specified directory as the application base.

ПараметрыOptions

ПараметрOption ОПИСАНИЕDescription
/nologo Отключает загрузочный баннер корпорации Майкрософт при запуске.Suppress the Microsoft startup banner display.
/silent Отключает отображение сообщений об успешно выполненных операциях.Suppress the display of success messages.
/verbose Отображает подробные сведения для отладки.Display detailed information for debugging. Примечание. Из-за ограничений операционных систем Windows 98 и Windows Millennium Edition этот параметр отображает намного меньше сведений.Note: Due to operating system limitations, this option does not display as much additional information on Windows 98 and Windows Millennium Edition.
/help, /?/help, /? Отображает синтаксис команды и параметры для текущего выпуска.Display command syntax and options for the current release.

ПримечанияRemarks

Для запуска Ngen.exe требуются права администратора.To run Ngen.exe, you must have administrative privileges.

Внимание!

Не запускайте программу NGen.exe в сборках с неполным доверием.Do not run Ngen.exe on assemblies that are not fully trusted. Начиная с .NET Framework 4, программа NGen.exe компилирует сборки с полным доверием, а политика управления доступом для кода (CAS) больше не вычисляется.Starting with the .NET Framework 4, Ngen.exe compiles assemblies with full trust, and code access security (CAS) policy is no longer evaluated.

Начиная с .NET Framework 4 образы в машинном коде, созданные с помощью NGen.exe, нельзя загружать в приложения, выполняющиеся в режиме частичного доверия.Starting with the .NET Framework 4, the native images that are generated with Ngen.exe can no longer be loaded into applications that are running in partial trust. Вместо этого вызывается JIT-компилятор.Instead, the just-in-time (JIT) compiler is invoked.

Программа Ngen.exe создает образы в машинном коде для сборки, указанной аргументом assemblyname, для действия install и всех его зависимостей.Ngen.exe generates native images for the assembly specified by the assemblyname argument to the install action and all its dependencies. Зависимости определяются по ссылкам в манифесте сборки.Dependencies are determined from references in the assembly manifest. Единственный сценарий, в котором необходимо задавать зависимость отдельно, — это когда приложение загружает зависимость с помощью отражения, например путем вызова метода Assembly.Load.The only scenario in which you need to install a dependency separately is when the application loads it using reflection, for example by calling the Assembly.Load method.

Важно!

Не используйте метод Assembly.LoadFrom с образами в машинном коде.Do not use the Assembly.LoadFrom method with native images. Образ, загруженный этим методом, не может использоваться другими сборками в контексте выполнения.An image loaded with this method cannot be used by other assemblies in the execution context.

Программа Ngen.exe ведет подсчет зависимостей.Ngen.exe maintains a count on dependencies. Например, пусть и MyAssembly.exe и YourAssembly.exe установлены в кэше образов в машинном коде и содержат ссылки на OurDependency.dll.For example, suppose MyAssembly.exe and YourAssembly.exe are both installed in the native image cache, and both have references to OurDependency.dll. При удалении MyAssembly.exe библиотека OurDependency.dll не удаляется.If MyAssembly.exe is uninstalled, OurDependency.dll is not uninstalled. Она удаляется только после удаления YourAssembly.exe.It is only removed when YourAssembly.exe is also uninstalled.

При создании образа в машинном коде для сборки из глобального кэша сборок необходимо указать ее отображаемое имя.If you are generating a native image for an assembly in the global assembly cache, specify its display name. См. раздел Assembly.FullName.See Assembly.FullName.

Образы в машинном коде, созданные программой Ngen.exe, могут совместно использоваться в доменах приложений.The native images that Ngen.exe generates can be shared across application domains. Это означает, что программу Ngen.exe можно использовать в сценариях приложений, требующих совместного использования сборок в доменах приложений.This means you can use Ngen.exe in application scenarios that require assemblies to be shared across application domains. Чтобы определить независимость от домена, выполните следующие действия.To specify domain neutrality:

При загрузке одной и той же сборки в несколько доменов приложений всегда используйте программный код, независимый от домена.Always use domain-neutral code when loading the same assembly into multiple application domains. Если образ в машинном коде, загруженный в общий домен приложения, загружается в неиспользуемый совместно домен, его использование невозможно.If a native image is loaded into a nonshared application domain after having been loaded into a shared domain, it cannot be used.

Примечание

Независимый от домена код не может быть выгружен, и быстродействие может слегка снизиться, особенно при доступе к статическим членам.Domain-neutral code cannot be unloaded, and performance may be slightly slower, particularly when accessing static members.

В этом разделе примечанийIn this Remarks section:

Формирование образов для различных сценариевGenerating images for different scenarios

После создания образа в машинном коде для сборки среда выполнения автоматически пытается обнаружить и использовать этот образ в машинном коде при каждом запуске сборки.After you have generated a native image for an assembly, the runtime automatically attempts to locate and use this native image each time it runs the assembly. В зависимости от сценариев использования может быть создано несколько образов.Multiple images can be generated, depending on usage scenarios.

Например, при запуске сборки в рамках сценария отладки или профилирования среда выполнения ищет образ в машинном коде, созданный с параметрами /Debug или /Profile.For example, if you run an assembly in a debugging or profiling scenario, the runtime looks for a native image that was generated with the /Debug or /Profile options. Если найти соответствующий образ в машинном коде не удается, среда выполнения возвращается к стандартной схеме JIT-компиляции.If it is unable to find a matching native image, the runtime reverts to standard JIT compilation. Единственным способом отладки образов в машинном коде является создание образа в машинном коде с параметром /Debug.The only way to debug native images is to create a native image with the /Debug option.

Действие uninstall также распознает сценарии, позволяя удалить все или только выбранные сценарии.The uninstall action also recognize scenarios, so you can uninstall all scenarios or only selected scenarios.

Определение случаев использования образов в машинном кодеDetermining when to Use native images

Образы в машинном коде могут повысить производительность в двух областях: оптимизация использования памяти и уменьшение времени запуска.Native images can provide performance improvements in two areas: improved memory use and reduced startup time.

Примечание

Производительность образов в машинном коде зависит от множества факторов, усложняющих анализ, например: шаблоны доступа к коду и данным, количество вызовов, выполняемых через границы модуля, и количество зависимостей, уже загруженных другими приложениями.Performance of native images depends on a number of factors that make analysis difficult, such as code and data access patterns, how many calls are made across module boundaries, and how many dependencies have already been loaded by other applications. Единственным способом определить, обеспечивают ли образы в машинном коде преимущество для конкретного приложения, являются тщательные измерения производительности в основных сценариях развертывания.The only way to determine whether native images benefit your application is by careful performance measurements in your key deployment scenarios.

Оптимизация использования памятиImproved memory use

Использование образов в машинном коде может заметно повысить эффективность использования памяти в ситуациях, когда код используется одновременно несколькими процессами.Native images can significantly improve memory use when code is shared between processes. Образы в машинном коде являются файлами Windows PE, поэтому несколько процессов могут совместно использовать одну копию DLL-файла. Напротив, образ в машинном коде, созданный JIT-компилятором, хранится в выделенной памяти и не может быть использован совместно.Native images are Windows PE files, so a single copy of a .dll file can be shared by multiple processes; by contrast, native code produced by the JIT compiler is stored in private memory and cannot be shared.

Преимущества совместно используемых кодовых страниц также распространяются на приложения, выполняемые с использованием служб терминалов.Applications that are run under terminal services can also benefit from shared code pages.

Кроме того, отсутствие необходимости загружать JIT-компилятор экономит определенный объем памяти для каждого экземпляра приложения.In addition, not loading the JIT compiler saves a fixed amount of memory for each application instance.

Ускорение запуска приложенияFaster application startup

Предварительная компиляция сборок с помощью программы Ngen.exe может уменьшить время запуска некоторых приложений.Precompiling assemblies with Ngen.exe can improve the startup time for some applications. В общем случае, преимущество достигается благодаря тому, что приложения совместно используют сборки компонентов, так как после запуска первого приложения общие компоненты оказываются уже загруженными в память для последующих приложений.In general, gains can be made when applications share component assemblies because after the first application has been started the shared components are already loaded for subsequent applications. При холодном запуске, когда все сборки в приложении должны загружаться с жесткого диска, использование образов в машинном коде не обеспечивает таких преимуществ, поскольку основное значение имеет время доступа к жесткому диску.Cold startup, in which all the assemblies in an application must be loaded from the hard disk, does not benefit as much from native images because the hard disk access time predominates.

На время запуска может повлиять жесткая привязка, поскольку все образы, жестко привязанные к главной сборке приложения, должны загружаться в одно и то же время.Hard binding can affect startup time, because all images that are hard bound to the main application assembly must be loaded at the same time.

Примечание

До .NET Framework 3.5 с пакетом обновления 1 (SP1) необходимо было помещать общие компоненты со строгими именами в глобальный кэш сборок, так как загрузчик выполняет дополнительную проверку сборок со строгими именами, отсутствующих в глобальном кэше сборок, фактически сводя на нет уменьшение времени запуска, создаваемое за счет использования образов в машинном коде.Before the .NET Framework 3.5 Service Pack 1, you should put shared, strong-named components in the global assembly cache, because the loader performs extra validation on strong-named assemblies that are not in the global assembly cache, effectively eliminating any improvement in startup time gained by using native images. За счет ряда усовершенствований, которые впервые появились в NET Framework 3.5 SP1, была исключена дополнительная проверка.Optimizations that were introduced in the .NET Framework 3.5 SP1 removed the extra validation.

Обзор аспектов использованияSummary of usage considerations

Следующие общие положения и аспекты использования приложений могут помочь принять решение, следует ли тратить ресурсы на оценку применения образов в машинном коде для разрабатываемого приложения.The following general considerations and application considerations may assist you in deciding whether to undertake the effort of evaluating native images for your application:

  • Образы в машинном коде загружаются быстрее чем CIL, поскольку они не требуют множества операций запуска, таких как JIT-компиляция и проверка безопасности типа.Native images load faster than MSIL because they eliminate the need for many startup activities, such as JIT compilation and type-safety verification.

  • За счет устранения JIT-компилятора из процесса разработки образы в машинном коде требуют меньшего первоначального объема работы.Native images require a smaller initial working set because there is no need for the JIT compiler.

  • Образы в машинном коде обеспечивают совместное использование кода несколькими процессами.Native images enable code sharing between processes.

  • Образам в машинном коде требуется больше места на жестком диске по сравнению со сборками CIL. Кроме того, их создание может занимать значительное время.Native images require more hard disk space than MSIL assemblies and may require considerable time to generate.

  • Образы в машинном коде необходимо обслуживать.Native images must be maintained.

    • При обслуживании исходной сборки или одной из ее зависимостей образы необходимо создавать заново.Images need to be regenerated when the original assembly or one of its dependencies is serviced.

    • Для одной сборки может понадобиться несколько образов в машинном коде, используемых в различных приложениях или различных сценариях.A single assembly may need multiple native images for use in different applications or different scenarios. Например, сведения о конфигурации в двух приложениях могут привести к различным решениям привязки для одной и той же зависимой сборки.For example, the configuration information in two applications might result in different binding decisions for the same dependent assembly.

    • Образы в машинном коде должны создаваться администратором, то есть под учетной записью Windows в группе "Администраторы".Native images must be generated by an administrator; that is, from a Windows account in the Administrators group.

Помимо этих общих положений, при рассмотрении преимуществ использования образов в машинном коде с точки зрения производительности необходимо учитывать суть разрабатываемого приложения.In addition to these general considerations, the nature of your application must be considered when determining whether native images might provide a performance benefit:

  • Если приложение выполняется в среде, в которой используется множество общих компонентов, образы в машинном коде обеспечивают совместное использование компонентов несколькими процессами.If your application runs in an environment that uses many shared components, native images allow the components to be shared by multiple processes.

  • Если приложение использует несколько доменов приложений, образы в машинном коде обеспечивают совместное использование кодовых страниц в нескольких доменах.If your application uses multiple application domains, native images allow code pages to be shared across domains.

    Примечание

    В .NET Framework версий 1.0 и 1.1 совместное использование образов в машинном коде в нескольких доменах приложений невозможно.In the .NET Framework versions 1.0 and 1.1, native images cannot be shared across application domains. Однако в версии 2.0 и более поздних версиях ситуация изменилась.This is not the case in version 2.0 or later.

  • Если приложение работает в среде сервера терминалов, образы в машинном коде обеспечивают совместное использование кодовых страниц.If your application will be run under Terminal Server, native images allow sharing of code pages.

  • При компиляции в образы в машинном коде большие приложения обычно получают ряд преимуществ.Large applications generally benefit from compilation to native images. В свою очередь, небольшие приложения особой выгоды обычно не получают.Small applications generally do not benefit.

  • Для приложений с длительным сроком выполнения JIT-компиляция во время выполнения обеспечивает немного лучшую производительность, чем образы в машинном коде.For long-running applications, run-time JIT compilation performs slightly better than native images. (Жесткая привязка может в определенной степени уменьшить эту разницу в производительности.)(Hard binding can mitigate this performance difference to some degree.)

Важность базовых адресов сборокImportance of assembly base addresses

Поскольку образы в машинном коде являются файлами Windows PE, они подвержены тем же проблемам изменения базовых адресов, что и другие исполняемые файлы.Because native images are Windows PE files, they are subject to the same rebasing issues as other executable files. При использовании жесткой привязки влияние перемещения на производительность становится еще более заметным.The performance cost of relocation is even more pronounced if hard binding is employed.

Чтобы задать базовый адрес для образа в машинном коде, с помощью соответствующего параметра компилятора можно задать базовый адрес сборки.To set the base address for a native image, use the appropriate option of your compiler to set the base address for the assembly. Программа Ngen.exe использует этот базовый адрес для образа в машинном коде.Ngen.exe uses this base address for the native image.

Примечание

Образы в машинном коде по размеру больше управляемых сборок, используемых для их создания.Native images are larger than the managed assemblies from which they were created. Базовые адреса должны быть рассчитаны с учетом таких увеличенных размеров.Base addresses must be calculated to allow for these larger sizes.

Для просмотра предпочитаемого базового адреса образа в машинном коде можно использовать такую программу, как dumpbin.exe.You can use a tool such as dumpbin.exe to view the preferred base address of a native image.

Жесткая привязкаHard binding

Жесткая привязка увеличивает производительность и уменьшает объем работы для образов в машинном коде.Hard binding increases throughput and reduces working set size for native images. Недостаток жесткой привязки состоит в том, что при загрузке сборки должны загружаться все образы, жестко привязанные к сборке.The disadvantage of hard binding is that all the images that are hard bound to an assembly must be loaded when the assembly is loaded. Для большого приложения это может заметно увеличить время запуска.This can significantly increase startup time for a large application.

Жесткая привязка подходит для зависимостей, загруженных во всех сценариях приложения, критичных для производительности.Hard binding is appropriate for dependencies that are loaded in all your application's performance-critical scenarios. Как и для других аспектов использования образов в машинном коде, единственным способом определить, повышает ли жесткая привязка производительность приложения, являются тщательные измерения производительности.As with any aspect of native image use, careful performance measurements are the only way to determine whether hard binding improves your application's performance.

Атрибуты DependencyAttribute и DefaultDependencyAttribute позволяют предоставить программе Ngen.exe подсказки, касающиеся жесткой привязки.The DependencyAttribute and DefaultDependencyAttribute attributes allow you to provide hard binding hints to Ngen.exe.

Примечание

Эти атрибуты являются подсказками для программы Ngen.exe, а не командами.These attributes are hints to Ngen.exe, not commands. Их использование не гарантирует выполнения жесткой привязки.Using them does not guarantee hard binding. В будущих выпусках значение этих атрибутов может измениться.The meaning of these attributes may change in future releases.

Задание для зависимости подсказки, касающейся привязкиSpecifying a binding hint for a dependency

Примените атрибут DependencyAttribute к сборке, чтобы указать вероятность того, что указанная зависимость будет загружаться.Apply the DependencyAttribute to an assembly to indicate the likelihood that a specified dependency will be loaded. LoadHint.Always указывает, что жесткая привязка подходит, Default указывает, что для зависимости должно использоваться значение по умолчанию, и Sometimes указывает, что жесткая привязка не подходит.LoadHint.Always indicates that hard binding is appropriate, Default indicates that the default for the dependency should be used, and Sometimes indicates that hard binding is not appropriate.

В следующем коде показаны атрибуты для сборки с двумя зависимостями.The following code shows the attributes for an assembly that has two dependencies. Первая зависимость (Assembly1) является подходящим кандидатом для жесткой привязки, а вторая (Assembly2) — нет.The first dependency (Assembly1) is an appropriate candidate for hard binding, and the second (Assembly2) is not.

Imports System.Runtime.CompilerServices
<Assembly:DependencyAttribute("Assembly1", LoadHint.Always)>
<Assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)>
using System.Runtime.CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)]
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)]
using namespace System::Runtime::CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)];
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)];

Имя сборки не включает в себя расширение имени файла.The assembly name does not include the file name extension. Разрешается использовать отображаемые имена.Display names can be used.

Задание для сборки подсказки для привязки по умолчаниюSpecifying a default binding hint for an assembly

Подсказки для привязки по умолчанию необходимы только для сборок, которые будут использоваться немедленно и часто любым приложением, связанным с этими сборками зависимостями.Default binding hints are only needed for assemblies that will be used immediately and frequently by any application that has a dependency on them. Чтобы определить необходимость использования жесткой привязки, к таким сборкам можно применить атрибут DefaultDependencyAttribute с LoadHint.Always.Apply the DefaultDependencyAttribute with LoadHint.Always to such assemblies to specify that hard binding should be used.

Примечание

Не стоит применять атрибут DefaultDependencyAttribute к DLL-сборкам, не подпадающим под эту категорию, поскольку применение атрибута с любым значением, отличным от LoadHint.Always, аналогично полному отсутствию атрибута.There is no reason to apply DefaultDependencyAttribute to .dll assemblies that do not fall into this category, because applying the attribute with any value other than LoadHint.Always has the same effect as not applying the attribute at all.

Корпорация Майкрософт использует атрибут DefaultDependencyAttribute для указания того, что жесткая привязка является значением по умолчанию для очень небольшого числа сборок в .NET Framework, например "mscorlib.dll".Microsoft uses the DefaultDependencyAttribute to specify that hard binding is the default for a very small number of assemblies in the .NET Framework, such as mscorlib.dll.

Отложенная обработкаDeferred processing

Создание образов в машинном коде для очень большого приложения может занять значительное время.Generation of native images for a very large application can take considerable time. Аналогичным образом, изменения общего компонента или настроек компьютера могут потребовать обновления многих образов в машинном коде.Similarly, changes to a shared component or changes to computer settings might require many native images to be updated. Для действий install и update предусмотрен параметр /queue, который помещает операцию в очередь для отложенного выполнения службой образов в машинном коде.The install and update actions have a /queue option that queues the operation for deferred execution by the native image service. Кроме того, программа Ngen.exe предусматривает действия queue и executeQueuedItems, которые дают определенные возможности управления этой службой.In addition, Ngen.exe has queue and executeQueuedItems actions that provide some control over the service. Подробнее см. в разделе Служба образов в машинном коде.For more information, see Native Image Service.

Образы в машинном коде и JIT-компиляцияNative images and JIT compilation

Если программа Ngen.exe обнаруживает в сборке методы, которые она не может создать, эти методы исключаются из этого образа.If Ngen.exe encounters any methods in an assembly that it cannot generate, it excludes them from the native image. Когда среда выполнения выполняет сборку, то при обнаружении метода, отсутствующего в образе в машинном коде, выполняется JIT-компиляция.When the runtime executes this assembly, it reverts to JIT compilation for the methods that were not included in the native image.

Кроме того, образы в машинном коде не используются, если сборка была модернизирована или по какой-либо причине стала недействительной.In addition, native images are not used if the assembly has been upgraded, or if the image has been invalidated for any reason.

Недействительные образыInvalid images

При использовании программы Ngen.exe для создания образа сборки в машинном коде результат зависит от заданных параметров командной строки и определенных настроек компьютера.When you use Ngen.exe to create a native image of an assembly, the output depends upon the command-line options that you specify and certain settings on your computer. В число этих параметров входят следующие характеристики.These settings include the following:

  • Версия .NET Framework.The version of the .NET Framework.

  • Версия операционной системы в случае перехода с семейства Windows 9x на семейство Windows NT.The version of the operating system, if the change is from the Windows 9x family to the Windows NT family.

  • Полное удостоверение сборки (оно изменяется при перекомпиляции).The exact identity of the assembly (recompilation changes identity).

  • Полное удостоверение всех сборок, на которые ссылается данная сборка (оно изменяется при перекомпиляции).The exact identity of all assemblies that the assembly references (recompilation changes identity).

  • Факторы безопасности.Security factors.

Программа Ngen.exe сохраняет эти сведения при создании образа в машинном коде.Ngen.exe records this information when it generates a native image. При выполнении сборки среда выполнения просматривает созданный образ в машинном коде на предмет таких параметров и сравнивает их с текущими параметрами среды компьютера.When you execute an assembly, the runtime looks for the native image generated with options and settings that match the computer's current environment. Если среда выполнения не находит соответствующий образ в машинном коде, выполняется JIT-компиляция.The runtime reverts to JIT compilation of an assembly if it cannot find a matching native image. Изменения следующих параметров компьютера и среды приводят к тому, что образы устаревают, то есть становятся непригодными для использования.The following changes to a computer's settings and environment cause native images to become invalid:

  • Версия .NET Framework.The version of the .NET Framework.

    При обновлении .NET Framework все образы в машинном коде, созданные с помощью программы Ngen.exe, становятся недействительными.If you apply an update to the .NET Framework, all native images that you have created using Ngen.exe become invalid. По этой причине, чтобы гарантировать повторное создание всех образов в машинном коде, все обновления .NET Framework выполняют команду Ngen Update.For this reason, all updates of the .NET Framework execute the Ngen Update command, to ensure that all native images are regenerated. Платформа .NET Framework автоматически создает новые образы в машинном коде для библиотек .NET Framework, которые она устанавливает.The .NET Framework automatically creates new native images for the .NET Framework libraries that it installs.

  • Версия операционной системы в случае перехода с семейства Windows 9x на семейство Windows NT.The version of the operating system, if the change is from the Windows 9x family to the Windows NT family.

    Например, при изменении версии операционной системы компьютера с Windows 98 на Windows XP все образы в машинном коде, хранящиеся в кэше образов в машинном коде, становятся недействительными.For example, if the version of the operating system running on a computer changes from Windows 98 to Windows XP, all native images stored in the native image cache become invalid. Тем не менее при изменении версии операционной системы с Windows 2000 на Windows XP образы остаются действительными.However, if the operating system changes from Windows 2000 to Windows XP, the images are not invalidated.

  • Полное удостоверение сборки.The exact identity of the assembly.

    При перекомпиляции сборки соответствующий образ в машинном коде устаревает.If you recompile an assembly, the assembly's corresponding native image becomes invalid.

  • Полное удостоверение всех сборок, на которые ссылается данная сборка.The exact identity of any assemblies the assembly references.

    При обновлении управляемой сборки все образы в машинном коде, прямо или косвенно зависящие от этой сборки, становятся недействительными и требуют повторного создания.If you update a managed assembly, all native images that directly or indirectly depend on that assembly become invalid and need to be regenerated. Это относится и к обычным ссылкам, и к зависимостям с жесткой привязкой.This includes both ordinary references and hard-bound dependencies. При любом обновлении программного обеспечения программа установки должна выполнить команду Ngen Update, чтобы гарантировать повторное создание всех зависимых образов в машинном коде.Whenever a software update is applied, the installation program should execute an Ngen Update command to ensure that all dependent native images are regenerated.

  • Факторы безопасности.Security factors.

    Изменение политики безопасности на компьютере, сопровождающееся отменой разрешений, выданных сборке ранее, может привести к устареванию ранее скомпилированного образа сборки.Changing machine security policy to restrict permissions previously granted to an assembly can cause a previously compiled native image for that assembly to become invalid.

    Подробную информацию об управлении доступом для кода в среде CLR и об использовании разрешений см. в разделе Управление доступом для кода.For detailed information about how the common language runtime administers code access security and how to use permissions, see Code Access Security.

Устранение неполадокTroubleshooting

Следующие разделы по устранению неполадок позволяют понять, какие образы в машинном коде используются, а какие — не могут использоваться для вашего приложения, определить, когда JIT-компилятор начинает компиляцию метода, а также демонстрируют, как отказаться от компиляции образов в машинном коде указанных методов.The following troubleshooting topics allow you to see which native images are being used and which cannot be used by your application, to determine when the JIT compiler starts to compile a method, and shows how to opt out of native image compilation of specified methods.

средство просмотра журнала привязки сборокAssembly Binding Log Viewer

Проверить, используются ли в приложении образы в машинном коде, можно с помощью Fuslogvw.exe (средства просмотра журнала привязок сборки).To confirm that native images are being used by your application, you can use the Fuslogvw.exe (Assembly Binding Log Viewer). Выберите Образы в машинном коде в поле Категории журнала в окне средства просмотра журнала привязок.Select Native Images in the Log Categories box on the binding log viewer window. Программа Fuslogvw.exe предоставляет сведения о причинах отклонения образа в машинном коде.Fuslogvw.exe provides information about why a native image was rejected.

Помощник по отладке управляемого кода JITCompilationStartThe JITCompilationStart managed debugging assistant

Чтобы определить, когда JIT-компилятор начинает компиляцию функции, можно использовать помощник по отладке управляемого кода jitCompilationStart.You can use the jitCompilationStart managed debugging assistant (MDA) to determine when the JIT compiler starts to compile a function.

Отказ от формирования образа в машинном кодеOpting out of native image generation

В некоторых случаях NGen.exe может испытывать трудности при создании образа в машинном коде для конкретного метода. Кроме того, может быть удобнее выполнить JIT-компиляцию метода вместо компиляции в образ в машинном коде.In some cases, NGen.exe may have difficulty generating a native image for a specific method, or you may prefer that the method be JIT compiled rather then compiled to a native image. В этом случае можно использовать атрибут System.Runtime.BypassNGenAttribute, чтобы запретить программе NGen.exe формирование образа в машинном коде для конкретного метода.In this case, you can use the System.Runtime.BypassNGenAttribute attribute to prevent NGen.exe from generating a native image for a particular method. Атрибут необходимо применять по отдельности к каждому методу, код которого не нужно включать в образ в машинном коде.The attribute must be applied individually to each method whose code you do not want to include in the native image. NGen.exe распознает атрибут и не создает код в образе в машинном коде для соответствующего метода.NGen.exe recognizes the attribute and does not generate code in the native image for the corresponding method.

Тем не менее обратите внимание, что BypassNGenAttribute не определен как тип в библиотеке классов .NET Framework.Note, however, that BypassNGenAttribute is not defined as a type in the .NET Framework Class Library. Для использования атрибута в коде, его необходимо сначала определить следующим образом.In order to consume the attribute in your code, you must first define it as follows:

namespace System.Runtime
{
   public class BypassNGenAttribute : Attribute 
   {
   }   
}
Namespace System.Runtime
   Public Class BypassNGenAttribute : Inherits Attribute 
   End Class   
End Namespace

Затем можно применить атрибут индивидуально для каждого метода.You can then apply the attribute on a per-method basis. Следующий пример указывает генератору образов в машинном коде, что ему не следует формировать образ в машинном коде для метода ExampleClass.ToJITCompile.The following example instructs the Native Image Generator that it should not generate a native image for the ExampleClass.ToJITCompile method.

using System;
using System.Runtime;

public class ExampleClass
{
   [BypassNGen]
   public void ToJITCompile()
   {
   }
}
Imports System.Runtime

Public Class ExampleClass
   <BypassNGen>
   Public Sub ToJITCompile()
   End Sub
End Class

ПримерыExamples

Следующая команда создает образ в машинном коде для приложения ClientApp.exe, расположенного в текущем каталоге, и устанавливает образ в кэш образов в машинном коде.The following command generates a native image for ClientApp.exe, located in the current directory, and installs the image in the native image cache. Если для сборки существует файл конфигурации, программа Ngen.exe использует его.If a configuration file exists for the assembly, Ngen.exe uses it. Кроме того, образы в машинном коде создаются для всех DLL-файлов, на которые ссылается программа ClientApp.exe.In addition, native images are generated for any .dll files that ClientApp.exe references.

ngen install ClientApp.exe

Образ, установленный с программой Ngen.exe, также называется корнем.An image installed with Ngen.exe is also called a root. Корень может быть приложением или общим компонентом.A root can be an application or a shared component.

Следующая команда создает образ в машинном коде для MyAssembly.exe с указанным путем.The following command generates a native image for MyAssembly.exe with the specified path.

ngen install c:\myfiles\MyAssembly.exe

При поиске сборок и их зависимостей программа Ngen.exe использует ту же самую логику тестирования, что и среда CLR.When locating assemblies and their dependencies, Ngen.exe uses the same probing logic used by the common language runtime. По умолчанию каталог, содержащий приложение ClientApp.exe, используется в качестве базового каталога приложения, с которого начинается тестирование всех сборок.By default, the directory that contains ClientApp.exe is used as the application base directory, and all assembly probing begins in this directory. Это поведение можно переопределить с помощью параметра /AppBase.You can override this behavior by using the /AppBase option.

Примечание

Поведение программы Ngen.exe было изменено по сравнению с .NET Framework версий 1.0 и 1.1, где в качестве базового каталога приложения использовался текущий каталог.This is a change from Ngen.exe behavior in the .NET Framework versions 1.0 and 1.1, where the application base is set to the current directory.

Сборка может использовать зависимость без ссылки, например, если она загружает DLL-файл с помощью метода Assembly.Load.An assembly can have a dependency without a reference, for example if it loads a .dll file by using the Assembly.Load method. С помощью параметра /ExeConfig для такого DLL-файла можно создать образ в машинном коде, используя сведения о конфигурации для сборки приложения.You can create a native image for such a .dll file by using configuration information for the application assembly, with the /ExeConfig option. Следующая команда создает образ в машинном коде для MyLib.dll,, используя сведения о конфигурации из MyApp.exe.The following command generates a native image for MyLib.dll, using the configuration information from MyApp.exe.

ngen install c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

Сборки, установленные таким способом, не удаляются при удалении приложения.Assemblies installed in this way are not removed when the application is removed.

Чтобы удалить зависимость, следует использовать те же параметры командной строки, которые использовались при ее установке.To uninstall a dependency, use the same command-line options that were used to install it. Следующая команда удаляет MyLib.dll из предыдущего примера.The following command uninstalls the MyLib.dll from the previous example.

ngen uninstall c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe

Чтобы создать образ в машинном коде для сборки в глобальном кэше сборок, следует использовать отображаемое имя сборки.To create a native image for an assembly in the global assembly cache, use the display name of the assembly. Например:For example:

ngen install "ClientApp, Version=1.0.0.0, Culture=neutral,
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"

Программа NGen.exe создает отдельный набор образов для каждого устанавливаемого сценария.NGen.exe generates a separate set of images for each scenario you install. Например, следующие команды устанавливают полный набор образов в машинном коде для обычной работы, другой полный набор для отладки, а третий — для профилирования.For example, the following commands install a complete set of native images for normal operation, another complete set for debugging, and a third for profiling:

ngen install MyApp.exe
ngen install MyApp.exe /debug
ngen install MyApp.exe /profile

Отображение кэша образов в машинном кодеDisplaying the Native Image Cache

Образы в машинном коде, установленные в кэш, можно отобразить с помощью программы Ngen.exe.Once native images are installed in the cache, they can be displayed using Ngen.exe. Следующая команда отображает все образы в машинном коде, находящиеся в кэше образов в машинном коде.The following command displays all native images in the native image cache.

ngen display

Действие display выводит сначала все корневые сборки, а затем выводит список всех образов в машинном коде на компьютере.The display action lists all the root assemblies first, followed by a list of all the native images on the computer.

Чтобы отобразить сведения только об этой сборке, можно использовать простое имя сборки.Use the simple name of an assembly to display information only for that assembly. Следующая команда выводит все образы в кэше образов в машинном коде, соответствующие неполному имени MyAssembly, их зависимости и все корни с зависимостями от MyAssembly:The following command displays all native images in the native image cache that match the partial name MyAssembly, their dependencies, and all roots that have a dependency on MyAssembly:

ngen display MyAssembly

Знание того, что корни зависят от общей сборки компонентов, полезно при определении влияния действия update после обновления общего компонента.Knowing what roots depend on a shared component assembly is useful in gauging the impact of an update action after the shared component is upgraded.

Если задано расширение файла сборки, необходимо либо указать путь, либо выполнить программу Ngen.exe из каталога, в котором находится сборка.If you specify an assembly's file extension, you must either specify the path or execute Ngen.exe from the directory containing the assembly:

ngen display c:\myApps\MyAssembly.exe

Следующая команда выводит все образы в машинном коде с именем MyAssembly и версией 1.0.0.0, содержащиеся в кэше образов в машинном коде.The following command displays all native images in the native image cache with the name MyAssembly and the version 1.0.0.0.

ngen display "myAssembly, version=1.0.0.0"

Обновление образовUpdating Images

Образы обычно обновляются после обновления общего компонента.Images are typically updated after a shared component has been upgraded. Для обновления всех образов в машинном коде, которые были изменены или для которых были изменены зависимости, используется действие update без аргументов.To update all native images that have changed, or whose dependencies have changed, use the update action with no arguments.

ngen update

Обновление всех образов может занять длительное время.Updating all images can be a lengthy process. С помощью параметра /queue можно поставить обновления в очередь выполнения службы образов в машинном коде.You can queue the updates for execution by the native image service by using the /queue option. Подробнее о параметре /queue и приоритетах установки см. в разделе Служба образов в машинном коде.For more information on the /queue option and installation priorities, see Native Image Service.

ngen update /queue

Удаление образовUninstalling Images

Программа Ngen.exe поддерживает список зависимостей, поэтому общие компоненты удаляются, только когда удалены все сборки, зависимые от этих компонентов.Ngen.exe maintains a list of dependencies, so that shared components are removed only when all assemblies that depend on them have been removed. Кроме того, общий компонент не удаляется, если он установлен как корень.In addition, a shared component is not removed if it has been installed as a root.

Следующая команда удаляет все сценарии для корня ClientApp.exe:The following command uninstalls all scenarios for the root ClientApp.exe:

ngen uninstall ClientApp

Удалить конкретные сценарии можно с помощью действия uninstall.The uninstall action can be used to remove specific scenarios. Следующая команда удаляет все сценарии отладки для ClientApp.exe:The following command uninstalls all debug scenarios for ClientApp.exe:

ngen uninstall ClientApp /debug

Примечание

При удалении сценариев /debug не удаляется сценарий, включающий и /profile, и /debug.Uninstalling /debug scenarios does not uninstall a scenario that includes both /profile and /debug.

Следующая команда удаляет все сценарии для конкретной версии ClientApp.exe:The following command uninstalls all scenarios for a specific version of ClientApp.exe:

ngen uninstall "ClientApp, Version=1.0.0.0"

Следующая команда удаляет все сценарии для "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL", или только сценарий отладки для этой сборки.The following commands uninstall all scenarios for "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL", or just the debug scenario for that assembly:

ngen uninstall "ClientApp, Version=1.0.0.0, Culture=neutral,
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"
ngen uninstall "ClientApp, Version=1.0.0.0, Culture=neutral,
  PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL" /debug

Как и в случае действия install, предоставление расширения требует либо выполнения программы Ngen.exe из каталога, содержащего сборку, либо указания полного пути.As with the install action, supplying an extension requires either executing Ngen.exe from the directory containing the assembly or specifying a full path.

Примеры, связанные со службой образов в машинном коде, см. в разделе Служба образов в машинном коде.For examples relating to the native image service, see Native Image Service.

Задача образов в машинном кодеNative Image Task

Задача образов в машинном коде — это задача Windows, которая создает и поддерживает образы в машинном коде.The native image task is a Windows task that generates and maintains native images. Задача образов в машинном коде автоматически создает и освобождает образы в машинном коде в поддерживаемых сценариях.The native image task generates and reclaims native images automatically for supported scenarios. Она также позволяет установщикам использовать программу Ngen.exe (генератор образов в машинном коде) для отложенного создания и обновления образов в машинном коде.It also enables installers to use Ngen.exe (Native Image Generator) to create and update native images at a deferred time.

Задача образов в машинном коде регистрируется однократно для каждой архитектуры ЦП, поддерживаемой на компьютере, чтобы обеспечить компиляцию приложений для каждой целевой архитектуры.The native image task is registered once for each CPU architecture supported on a computer, to allow compilation for applications that target each architecture:

Имя задачиTask name 32-разрядный компьютер32-bit computer 64-разрядный компьютер64-bit computer
NET Framework NGEN v4.0.30319NET Framework NGEN v4.0.30319 YesYes YesYes
NET Framework NGEN v4.0.30319 64NET Framework NGEN v4.0.30319 64 НетNo YesYes

Задача образов в машинном коде доступна в .NET Framework 4.5 и более поздних версий при выполнении в ОС Windows 8 или более поздних версий.The native image task is available in the .NET Framework 4.5 and later versions, when running on Windows 8 or later. В более ранних версиях Windows платформа .NET Framework использует службу образов в машинном коде.On earlier versions of Windows, the .NET Framework uses the Native Image Service.

Время жизни задачиTask Lifetime

Как правило, планировщик заданий Windows запускает задачу образов в машинном коде каждую ночь, когда компьютер бездействует.In general, the Windows Task Scheduler starts the native image task every night when the computer is idle. Задача проверяет любые отложенные действия, помещенные в очередь установщиками приложений, любые отложенные запросы на обновление образов в машинном коде и любые операции автоматического создания образов.The task checks for any deferred work that is queued by application installers, any deferred native image update requests, and any automatic image creation. Задача завершает невыполненные операции, а затем завершает работу.The task completes outstanding work items and then shuts down. Если компьютер выводится из состояния бездействия во время выполнении задачи, она прерывается.If the computer stops being idle while the task is running, the task stops.

Задачу образов в машинном коде можно также запустить вручную из интерфейса планировщика заданий или посредством вызовов NGen.exe.You can also start the native image task manually through the Task Scheduler UI or through manual calls to NGen.exe. Если задача запускается одним из этих способов, ее выполнение продолжается при выводе компьютера из состояния бездействия.If the task is started through either of these methods, it will continue running when the computer is no longer idle. Образам, созданным вручную с помощью NGen.exe, назначаются приоритеты, что обеспечивает предсказуемость поведения установщиков приложений.Images created manually by using NGen.exe are prioritized to enable predictable behavior for application installers.

Служба образов в машинном кодеNative Image Service

Служба образов в машинном коде — это служба Windows, которая создает и поддерживает образы в машинном коде.The native image service is a Windows service that generates and maintains native images. Она позволяет разработчикам откладывать установку и обновление образов в машинном коде и выполнять эти процедуры позже, когда компьютер простаивает.The native image service allows the developer to defer the installation and update of native images to periods when the computer is idle.

Как правило, служба образов в машинном коде запускается программой установки (установщиком) приложения или обновления.Normally, the native image service is initiated by the installation program (installer) for an application or update. Для действий с приоритетом 3 служба выполняется во время простоя компьютера.For priority 3 actions, the service executes during idle time on the computer. Служба сохраняет свое состояние и может при необходимости возобновлять работу после перезагрузки.The service saves its state and is capable of continuing through multiple reboots if necessary. Для нескольких компиляций образов может быть организована очередь.Multiple image compilations can be queued.

Служба также взаимодействует с командой Ngen.exe, выполняемой вручную.The service also interacts with the manual Ngen.exe command. Команды, выполняемые вручную, имеют приоритет над фоновыми действиями.Manual commands take precedence over background activity.

Примечание

В операционной системе Windows Vista служба образов в машинном коде имеет имя "Microsoft.NET Framework NGEN v2.0.50727_X86" или "Microsoft.NET Framework NGEN v2.0.50727_X64".On Windows Vista, the name displayed for the native image service is "Microsoft.NET Framework NGEN v2.0.50727_X86" or "Microsoft.NET Framework NGEN v2.0.50727_X64". Во всех более ранних версиях Microsoft Windows ее имя — ".NET Runtime Optimization Service v2.0.50727_X86" или ".NET Runtime Optimization Service v2.0.50727_X64".On all earlier versions of Microsoft Windows, the name is ".NET Runtime Optimization Service v2.0.50727_X86" or ".NET Runtime Optimization Service v2.0.50727_X64".

Запуск отложенных операцийLaunching Deferred Operations

Перед началом установки или обновления рекомендуется приостановить службу.Before beginning an installation or upgrade, pausing the service is recommended. Это позволит заблокировать ее на время, пока установщик будет копировать файлы или помещать сборки в глобальный кэш сборок.This ensures that the service does not execute while the installer is copying files or putting assemblies in the global assembly cache. Для приостановки службы используется следующая командная строка Ngen.exe:The following Ngen.exe command line pauses the service:

ngen queue pause

После того как все отложенные операции поставлены в очередь, работу службы можно возобновить с помощью следующей команды:When all deferred operations have been queued, the following command allows the service to resume:

ngen queue continue

Чтобы отложить создание образов в машинном коде при установке нового приложения или обновлении общего компонента, используйте параметр /queue с действием install или update.To defer native image generation when installing a new application or when updating a shared component, use the /queue option with the install or update actions. Следующие командные строки Ngen.exe позволяют установить образ общего компонента в машинном коде и выполнить обновление всех корней, которых это может касаться:The following Ngen.exe command lines install a native image for a shared component and perform an update of all roots that may have been affected:

ngen install MyComponent /queue
ngen update /queue

Действие update заново создает все образы в машинном коде, которые стали недействительными, а не только те, которые используют MyComponent.The update action regenerates all native images that have been invalidated, not just those that use MyComponent.

Если в приложении слишком много корней, можно учитывать приоритеты отложенных действий.If your application consists of many roots, you can control the priority of the deferred actions. Приведенные ниже команды создают очередь для установки трех корней.The following commands queue the installation of three roots. Первой устанавливается сборка Assembly1, не дожидаясь периода бездействия.Assembly1 is installed first, without waiting for idle time. Сборка Assembly2 также устанавливается без ожидания бездействия, но после завершения всех действий с приоритетом 1.Assembly2 is also installed without waiting for idle time, but after all priority 1 actions have completed. Сборка Assembly3 устанавливается, когда служба обнаруживает, что компьютер бездействует.Assembly3 is installed when the service detects that the computer is idle.

ngen install Assembly1 /queue:1
ngen install Assembly2 /queue:2
ngen install Assembly3 /queue:3

Вы можете задать синхронное выполнение действий, находящихся в очереди, с помощью действия executeQueuedItems.You can force queued actions to occur synchronously by using the executeQueuedItems action. Если задать необязательный приоритет, это действие затронет только те действия в очереди, которые имеют такой же или более низкий приоритет.If you supply the optional priority, this action affects only the queued actions that have equal or lower priority. По умолчанию подразумевается приоритет 3, поэтому следующая команда Ngen.exe обработает все действия в очереди немедленно и не вернет управление, пока они не закончатся:The default priority is 3, so the following Ngen.exe command processes all queued actions immediately, and does not return until they are finished:

ngen executeQueuedItems

Синхронные команды выполняются программой Ngen.exe и не используют службу образов в машинном коде.Synchronous commands are executed by Ngen.exe and do not use the native image service. Можно выполнять действия с помощью Ngen.exe, пока служба образов в машинном коде работает.You can execute actions using Ngen.exe while the native image service is running.

Завершение работы службыService Shutdown

После того как служба инициирована выполнением команды Ngen.exe с параметром /queue, она продолжает работать в фоновом режиме, пока не будут завершены все действия.After being initiated by the execution of an Ngen.exe command that includes the /queue option, the service runs in the background until all actions have been completed. Служба сохраняет свое состояние и может при необходимости возобновлять работу после перезагрузки.The service saves its state so that it can continue through multiple reboots if necessary. Как только служба обнаруживает, что в очереди больше нет действий, она сбрасывает свое состояние, чтобы не запускаться повторно после очередной перезагрузки компьютера, и затем завершает работу.When the service detects that there are no more actions queued, it resets its status so that it will not restart the next time the computer is booted, and then it shuts itself down.

Взаимодействие службы с клиентамиService Interaction with Clients

В версии .NET Framework 2.0 взаимодействие со службой образов в машинном коде может осуществляться только через программу командной строки Ngen.exe.In the .NET Framework version 2.0, the only interaction with the native image service is through the command-line tool Ngen.exe. Используйте эту программу в скриптах установки для управления очередями действий, выполняемых службой образов в машинном коде, и для взаимодействия с этой службой.Use the command-line tool in installation scripts to queue actions for the native image service and to interact with the service.

См. такжеSee also