Ngen.exe (Gerador de Imagens Nativas)
O Gerador de Imagem Nativa (Ngen.exe) é uma ferramenta que melhora o desempenho de aplicativos gerenciados. Ngen.exe cria imagens nativas, que são arquivos que contém o código de máquina específico do processamento compilado e as instala no cache de imagem nativa do computador local. O runtime pode usar imagens nativas do cache em vez de usar o compilador JIT (Just-In-Time) para compilar o assembly original.
Observação
Ngen.exe compila imagens nativas para assemblies direcionados somente ao .NET Framework. O gerador de imagem nativa equivalente para o .NET Core é CrossGen.
Alterações no NGen.exe no .NET Framework 4:
Ngen.exe agora compila assemblies com confiança total, e a política de segurança de acesso de código (CAS) deixa de ser avaliada.
As imagens nativas geradas com Ngen.exe não podem mais ser carregadas em aplicativos em execução com confiança parcial.
Alterações feitas em Ngen.exe no .NET Framework versão 2.0:
A instalação de um assembly também instala suas dependências, o que simplifica a sintaxe de Ngen.exe.
As imagens nativas agora podem ser compartilhadas entre domínios de aplicativo.
Uma nova ação,
update
, recria imagens que foram invalidadas.As ações podem ser adiadas para execução por um serviço que usa o tempo ocioso no computador para gerar e instalar imagens.
Algumas causas da invalidação de imagem são eliminadas.
No Windows 8, confira Tarefa de Imagem Nativa.
Para obter mais informações sobre como usar o Ngen.exe e o serviço de imagem nativa, consulte Serviço de imagem nativa.
Observação
A sintaxe de Ngen.exe para as versões 1.0 e 1.1 do .NET Framework pode ser encontrada em Sintaxe herdada do Gerador de Imagens Nativas (Ngen.exe).
Essa ferramenta é instalada automaticamente com o Visual Studio. Para executar a ferramenta, use o Prompt de Comando do Desenvolvedor do Visual Studio ou o PowerShell do Desenvolvedor do Visual Studio.
No prompt de comando, digite o seguinte:
Syntax
ngen action [options]
ngen /? | /help
Ações
A tabela a seguir mostra a sintaxe de cada action
. Para obter descrições das partes individuais de um action
, confira as tabelas Argumentos, Níveis de Prioridade, Cenários e Configuração. A tabela Opções descreve o options
e as opções da ajuda.
Ação | Descrição |
---|---|
install [assemblyName assemblyPath | ] [scenarios ] [] [/queue config : [{1 3 |2 |}]] |
Gere imagens nativas para um assembly e suas dependências e instale as imagens no cache de imagem nativa. Se /queue for especificado, a ação será enfileirada para o serviço de imagem nativa. A prioridade padrão é 3. Confira a tabela Níveis de Prioridade. |
uninstall [assemblyName | assemblyPath ] [scenarios ] [config ] |
Exclua as imagens nativas de um assembly e suas dependências do cache de imagem nativa. Para desinstalar uma única imagem e suas dependências, use os mesmos argumentos de linha de comando que foram usados para instalar a imagem. Observação: do .NET Framework 4 em diante, a ação uninstall * não tem mais suporte. |
update [/queue ] |
Atualize imagens nativas que se tornaram inválidas. Se /queue for especificado, as atualizações serão enfileiradas para o serviço de imagem nativa. Como as atualizações estão sempre programadas na prioridade 3, elas são executadas quando o computador está ocioso. |
display [assemblyName | assemblyPath ] |
Exiba o estado das imagens nativas para um assembly e suas dependências. Se nenhum argumento for fornecido, tudo no cache de imagem nativa será exibido. |
executeQueuedItems [1|2|3 ]-ou- eqi [1|2|3] |
Execute o trabalho de compilação enfileirado. Se uma prioridade for especificada, trabalhos de compilação com prioridade maior ou igual serão executados. Se nenhuma prioridade for especificada, todos os trabalhos de compilação enfileirados serão executados. |
queue {pause | | continue status } |
Pause o serviço de imagem nativa, deixe o serviço pausado continuar ou consulte o status do serviço. |
Argumentos
Argument | Descrição |
---|---|
assemblyName |
O nome para exibição completo do assembly. Por exemplo, "myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5" . Observação: é possível fornecer um nome de assembly parcial, por exemplo, myAssembly para as ações display e uninstall . Somente um assembly pode ser especificado por linha de comando de Ngen.exe. |
assemblyPath |
O caminho explícito do assembly. É possível especificar um caminho completo ou relativo. Se você especificar um nome de arquivo sem um caminho, o assembly deverá estar localizado no diretório atual. Somente um assembly pode ser especificado por linha de comando de Ngen.exe. |
Níveis de Prioridade
Prioridade | Descrição |
---|---|
1 |
As imagens nativas são geradas e instaladas imediatamente, sem aguardar o tempo ocioso. |
2 |
As imagens nativas são geradas e instaladas sem aguardar o tempo ocioso, mas depois de todas as ações de prioridade 1 (e suas dependências) serem concluídas. |
3 |
As imagens nativas são instaladas quando o serviço de imagem nativa detecta que o computador está ocioso. Consulte Serviço de imagem nativa. |
Cenários
Cenário | Descrição |
---|---|
/Debug |
Gere imagens nativas que possam ser usadas em um depurador. |
/Profile |
Gere imagens nativas que possam ser usadas em um criador de perfil. |
/NoDependencies |
Gere o número mínimo de imagens nativas exigidas pelas opções de cenário especificadas. |
Config
Configuração | Descrição |
---|---|
/ExeConfig: exePath |
Use a configuração do assembly executável especificado. Ngen.exe precisa tomar as mesmas decisões do carregador durante a associação a dependências. Quando um componente compartilhado é carregado no tempo de execução, usando-se o método Load, o arquivo de configuração do aplicativo determina as dependências carregadas para o componente compartilhado — por exemplo, a versão de uma dependência carregada. A opção /ExeConfig dá a Ngen.exe orientações sobre quais dependências seriam carregadas no tempo de execução. |
/AppBase: directoryPath |
Para localizar dependências, use o diretório especificado como a base do aplicativo. |
Opções
Opção | Descrição |
---|---|
/nologo |
Suprima a exibição do banner de inicialização da Microsoft. |
/silent |
Suprima a exibição das mensagens de êxito. |
/verbose |
Exiba informações detalhadas da depuração. |
/help , /? |
Exiba a sintaxe de comando e as opções da versão atual. |
Comentários
Para executar Ngen.exe, você deve ter privilégios administrativos.
Cuidado
Não execute Ngen.exe em assemblies que não sejam totalmente confiáveis. Do .NET Framework 4 em diante, o Ngen.exe compila assemblies com confiança total, e a política de segurança de acesso de código (CAS) deixa de ser avaliada.
Do .NET Framework 4 em diante, as imagens nativas geradas com Ngen.exe não podem mais ser carregadas em aplicativos em execução com confiança parcial. Em vez disso, o compilador JIT é invocado.
O Ngen.exe gerencia imagens nativas para o assembly especificado pelo argumento assemblyname
para a ação install
e todas as suas dependências. As dependências são determinadas com base nas referências do manifesto do assembly. O único cenário no qual você precisa instalar uma dependência separadamente é quando o aplicativo a carrega usando a reflexão, por exemplo, chamando o método Assembly.Load.
Importante
Não use o método Assembly.LoadFrom com imagens nativas. Uma imagem carregada com esse método não pode ser usada por outros assemblies no contexto da execução.
Ngen.exe mantém uma contagem das dependências. Por exemplo, suponhamos que MyAssembly.exe
e YourAssembly.exe
estejam ambos instalados no cache de imagem nativa, e ambos tenham referências para OurDependency.dll
. Se MyAssembly.exe
for desinstalado, OurDependency.dll
não será desinstalado. Ele só é removido quando YourAssembly.exe
também é desinstalado.
Se você estiver gerando uma imagem nativa para um assembly no cache de assembly global, especifique seu nome para exibição. Consulte Assembly.FullName.
As imagens nativas geradas por Ngen.exe podem ser compartilhadas entre domínios de aplicativo. Isso significa que é possível usar Ngen.exe em cenários de aplicativo que exijam que os assemblies sejam compartilhados entre domínios de aplicativo. Para especificar a neutralidade do domínio:
Aplique o atributo LoaderOptimizationAttribute ao aplicativo.
Defina a propriedade AppDomainSetup.LoaderOptimization quando você cria informações de configuração para um novo domínio de aplicativo.
Sempre use o código neutro de domínio ao carregar o mesmo assembly em vários domínios de aplicativo. Se uma imagem nativa for carregada em um domínio de aplicativo não compartilhado depois de ter sido carregada em um domínio compartilhado, ela não poderá ser usada.
Observação
O código neutro de domínio não pode ser descarregado, e o desempenho pode ser um pouco mais lento, especialmente durante o acesso a membros estáticos.
Nesta seção Observações:
Gerar imagens para cenários diferentes
Depois que você gerou uma imagem nativa para um assembly, o tempo de execução tenta localizar e usar automaticamente essa imagem nativa sempre que executa o assembly. Várias imagens podem ser geradas, dependendo dos cenários de uso.
Por exemplo, se você executar um assembly em um cenário de depuração ou de criação de perfil, o runtime procurará uma imagem nativa gerada com as opções /Debug
ou /Profile
. Caso ele não consiga encontrar uma imagem nativa correspondente, o runtime é revertido para a compilação JIT padrão. A única maneira de depurar imagens nativas é criando uma imagem nativa com a opção /Debug
.
Como a ação uninstall
também reconhece cenários, é possível desinstalar todos os cenários ou apenas os cenários selecionados.
Determinar quando usar imagens nativas
Imagens nativas podem oferecer melhorias de desempenho em duas áreas: melhor uso da memória e tempo de inicialização reduzido.
Observação
O desempenho de imagens nativas depende de vários fatores que dificultam a análise como, por exemplo, padrões de acesso ao código e aos dados, quantas chamadas são feitas entre os limites do módulo e quantas dependências já foram carregadas por outros aplicativos. A única maneira de determinar se as imagens nativas beneficiam o aplicativo é por meio de medidas de desempenho cuidadosas nos principais cenários de implantação.
Uso de memória aprimorado
Imagens nativas podem melhorar significativamente o uso da memória quando o código é compartilhado entre processos. Como imagens nativas são arquivos do Windows PE, uma única cópia de um arquivo .dll pode ser compartilhada por vários processos; por outro lado, o código nativo produzido pelo compilador JIT é armazenado em memória privada e não pode ser compartilhada.
Aplicativos executados em serviços de terminal também podem aproveitar páginas de código compartilhadas.
Além disso, o não carregamento do compilador JIT salva uma quantidade de memória fixa para cada instância do aplicativo.
Inicialização mais rápida do aplicativo
A pré-compilação de assemblies com Ngen.exe pode melhorar o tempo de inicialização de alguns aplicativos. Em geral, os ganhos podem acontecer quando aplicativos compartilham assemblies de componente, porque depois que o primeiro aplicativo foi iniciado os componentes compartilhados já estão carregados para aplicativos subsequentes. A inicialização fria, em que todos os assemblies em um aplicativo devem ser carregados do disco rígido, não beneficia tanto quanto imagens nativas porque o tempo de acesso ao disco rígido predomina.
A associação forçada pode afetar o tempo de inicialização, pois todas as imagens solidamente associadas ao assembly do aplicativo principal devem ser carregadas ao mesmo tempo.
Observação
Antes do .NET Framework 3.5 Service Pack 1, você tinha que colocar componentes compartilhados, de nome forte, no cache de assembly global, pois o carregador realiza a validação extra em assemblies de nome forte que não estão no cache de assembly global, o que elimina efetivamente qualquer melhoria no tempo da inicialização obtido usando imagens nativas. As otimizações que foram introduzidas no .NET Framework 3.5 SP1 removeram a validação extra.
Resumo das considerações de uso
As seguintes considerações gerais e as considerações de aplicativo podem ajudá-lo na decisão de assumir o esforço de avaliação das imagens nativas para o aplicativo:
As imagens nativas são carregadas mais rapidamente do que o CIL porque eliminam a necessidade de muitas atividades de inicialização, como compilação JIT e verificação de segurança de tipo.
As imagens nativas exigem um conjunto de trabalho inicial menor porque não há necessidade do compilador JIT.
As imagens nativas permitem o compartilhamento de código entre processos.
As imagens nativas exigem mais espaço em disco rígido do que os assemblies CIL e podem exigir um tempo considerável para serem geradas.
As imagens nativas devem ser mantidas.
As imagens precisam ser regeneradas quando o assembly original ou uma de suas dependências é atendida.
Um único assembly pode precisar de várias imagens nativas que serão usadas em aplicativos diferentes ou em cenários diferentes. Por exemplo, as informações de configuração em dois aplicativos podem resultar em decisões de associação diferentes para o mesmo assembly dependente.
As imagens nativas devem ser geradas por um administrador; ou seja, com base em uma conta do Windows no grupo Administradores.
Além dessas considerações gerais, a natureza do aplicativo deve ser levada em consideração durante a determinação da possibilidade das imagens nativas podem oferecer um benefício de desempenho:
Se o aplicativo for executado em um ambiente que usa vários componentes compartilhados, as imagens nativas permitirão que os componentes sejam compartilhados por vários processos.
Se o aplicativo usar vários domínios de aplicativo, as imagens nativas permitirão que as páginas de código sejam compartilhadas entre domínios.
Observação
No .NET Framework versões 1.0 e 1.1, as imagens nativas não podem ser compartilhadas entre domínios de aplicativo. Esse pode não ser o caso na versão 2.0 ou posterior.
Se o aplicativo for executado no servidor Host da Sessão da Área de Trabalho Remota, as imagens nativas permitirão o compartilhamento das páginas de código.
Os aplicativos grandes normalmente se beneficiam da compilação para imagens nativas. Os aplicativos pequenos normalmente não beneficiam.
Para aplicativos executados por muito tempo, a compilação JIT do tempo de execução é um pouco melhor do que a de imagens nativas. (A associação forçada pode atenuar essa diferença de desempenho em algum grau.)
Importância de endereços de base do assembly
Como são arquivos do Windows PE, as imagens nativas estão sujeitas aos mesmos problemas de rebase de outros arquivos executáveis. O custo de desempenho da realocação ficará ainda mais evidente se a associação forçada não for utilizada.
Para definir o endereço base para uma imagem nativa, use a opção apropriada do compilador para definir o endereço base do assembly. Ngen.exe usa esse endereço base para a imagem nativa.
Observação
As imagens nativas são maiores que os assemblies gerenciados a partir dos quais foram criadas. Os endereços de base devem ser calculados para possibilitar tamanhos maiores.
É possível usar uma ferramenta como dumpbin.exe para exibir o endereço de base preferencial de uma imagem nativa.
Associação forçada
A associação forçada aumenta a taxa de transferência e reduz o tamanho do conjunto de trabalho de imagens nativas. A desvantagem da associação forçada é que todas as imagens associadas forçadamente a um assembly devem ser carregadas quando o assembly é carregado. Isso pode aumentar significativamente o tempo de inicialização de um aplicativo grande.
A associação forçada é apropriada para dependências carregadas em todos os cenários de desempenho crítico do aplicativo. Assim como acontece com qualquer aspecto do uso da imagem nativa, medidas de desempenho cuidadosas são a única maneira de determinar se a associação forçada melhora o desempenho do aplicativo.
Os atributos DependencyAttribute e DefaultDependencyAttribute permitem que você dê dicas de associação forçada a Ngen.exe.
Observação
Esses atributos são dicas para Ngen.exe, e não comandos. O uso deles não garante a associação forçada. O significado desses atributos pode ser alterado em versões futuras.
Especificar uma dica de associação para uma dependência
Aplique o DependencyAttribute a um assembly para indicar a probabilidade de que uma dependência especificada será carregada. LoadHint.Always indica que a associação forçada é apropriada, Default indica que o padrão da dependência deve ser usado e Sometimes indica que a associação forçada não é apropriada.
O código a seguir mostra os atributos de um assembly que possui duas dependências. A primeira dependência (Assembly1) é uma candidata apropriada à associação forçada, mas a segunda (Assembly2) não é.
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)];
O nome do assembly não inclui a extensão do nome de arquivo. Os nomes para exibição podem ser usados.
Especificar uma dica de associação padrão para um assembly
As dicas de associação padrão só são necessárias para assemblies que serão usados imediata e frequentemente por qualquer aplicativo que tenha uma dependência neles. Aplique o DefaultDependencyAttribute com LoadHint.Always a esses assemblies para especificar que a associação forçada deve ser usada.
Observação
Não há motivo para aplicar DefaultDependencyAttribute a assemblies .dll que não estejam nessa categoria, porque a aplicação do atributo com qualquer valor diferente de LoadHint.Always tem o mesmo efeito de não aplicar o atributo.
A Microsoft usa o DefaultDependencyAttribute para especificar que a associação forçada é o padrão para um número muito pequeno de assemblies no .NET Framework como, por exemplo, mscorlib.dll.
Processamento adiado
A geração de imagens nativas para um aplicativo muito grande pode demorar um tempo considerável. Da mesma forma, alterações feitas em um componente compartilhado ou alterações feitas em configurações do computador podem exigir a atualização de muitas imagens nativas. As ações install
e update
têm uma opção /queue
que enfileira a operação para execução adiada pelo serviço de imagem nativa. Além disso, Ngen.exe tem ações queue
e executeQueuedItems
que oferecem certo controle sobre o serviço. Para obter mais informações, consulte Serviço de imagem nativa.
Imagens nativas e compilação JIT
Se encontrar algum método em um assembly que não puder gerar, Ngen.exe os excluirá da imagem nativa. Ao executar esse assembly, o runtime o reverte para compilação JIT dos métodos que não foram incluídos na imagem nativa.
Além disso, as imagens nativas não serão usadas se o assembly tiver sido atualizado, ou se a imagem tiver sido invalidada por qualquer motivo.
Imagens inválidas
Quando você usa Ngen.exe para criar uma imagem nativa de um assembly, a saída depende das opções de linha de comando especificadas e de determinadas configurações do computador. Essas configurações incluem o seguinte:
A versão do .NET Framework.
A identidade exata do assembly (recompilação altera a identidade).
A identidade exata de todos os assemblies aos quais o assembly faz referência (recompilação altera a identidade).
Fatores de segurança.
Ngen.exe registra essas informações ao gerar uma imagem nativa. Quando você executa um assembly, o runtime procura a imagem nativa gerada com opções e configurações correspondentes ao ambiente atual do computador. O runtime será revertido para a compilação JIT de um assembly se não conseguir encontrar uma imagem nativa correspondente. As seguintes alterações feitas nas configurações e no ambiente de um computador invalidam imagens nativas:
A versão do .NET Framework.
Se você aplicar uma atualização ao .NET Framework, todas as imagens nativas criadas usando-se Ngen.exe serão invalidadas. Por esse motivo, todas as atualizações do .NET Framework executam o comando
Ngen Update
, para garantir que todas as imagens nativas sejam regeneradas. O .NET Framework cria automaticamente novas imagens nativas para as bibliotecas do .NET Framework instaladas.A identidade exata do assembly.
Se você recompilar um assembly, a imagem nativa correspondente do assembly será invalidada.
A identidade exata de todos os assemblies aos quais o assembly faz referência.
Se você atualizar um assembly gerenciado, todas as imagens nativas que dependam direta ou indiretamente desse assembly serão invalidadas e precisarão ser regeneradas. Isso inclui as referências comuns e as dependências associadas forçadamente. Sempre que uma atualização de software for aplicada, o programa de instalação deverá executar um comando
Ngen Update
para garantir que as todas as imagens nativas dependentes sejam regeneradas.Fatores de segurança.
A alteração da política de segurança do computador para restringir permissões concedidas anteriormente a um assembly pode invalidar uma imagem nativa compilada anteriormente para esse assembly.
Para obter informações detalhadas sobre como o Common Language Runtime administra a segurança de acesso do código e como usar permissões, confira Segurança de acesso do código.
Solução de problemas
Os tópicos de solução de problemas a seguir permitem que você veja quais imagens nativas estão sendo usadas e quais não podem ser usadas por seu aplicativo, para determinar quando o compilador JIT começa a compilar um método, e mostra como recusar a compilação de imagem nativa dos métodos especificados.
Visualizador de Log de Associação do Assembly
Para confirmar que as imagens nativas estão sendo usadas pelo aplicativo, é possível usar Fuslogvw.exe (Visualizador do Log de Associações de Assembly). Selecione Imagens Nativas na caixa Categorias de Log na janela do visualizador de log da associação. O Fuslogvw.exe fornece informações sobre por que uma imagem nativa foi rejeitada.
O assistente de depuração gerenciado JITCompilationStart
É possível usar o MDA (Assistente para depuração gerenciada) jitCompilationStart para determinar quando o compilador JIT começa a compilar uma função.
Recusa da geração automática de imagem nativa
Em alguns casos, o NGen.exe pode ter dificuldade para gerar uma imagem nativa para um método específico, ou talvez você prefira que o método seja compilado pelo JIT, em vez de ser compilado para uma imagem nativa. Nesse caso, você pode usar o atributo System.Runtime.BypassNGenAttribute
para impedir que o NGen.exe gere uma imagem nativa para um método específico. O atributo deve ser aplicado individualmente a cada método cujo código você não quer incluir na imagem nativa. O NGen.exe reconhece o atributo e não gera um código na imagem nativa para o método correspondente.
No entanto, observe que BypassNGenAttribute
não está definido como um tipo na Biblioteca de Classes .NET Framework. Para consumir o atributo em seu código, primeiro definia-o da seguinte maneira:
namespace System.Runtime
{
[AttributeUsage(AttributeTargets.Method |
AttributeTargets.Constructor |
AttributeTargets.Property)]
public class BypassNGenAttribute : Attribute
{
}
}
Namespace System.Runtime
<AttributeUsage(AttributeTargets.Method Or
AttributeTargets.Constructor Or
AttributeTargets.Property)>
Public Class BypassNGenAttribute : Inherits Attribute
End Class
End Namespace
Depois, você pode aplicar o atributo de acordo com o método. O exemplo a seguir instrui o Gerador de imagem nativa que ele não deve gerar uma imagem nativa para o método ExampleClass.ToJITCompile
.
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
Exemplos
O comando a seguir gera uma imagem nativa para ClientApp.exe
, localizado no diretório atual, e instala a imagem no cache de imagem nativa. Se existir um arquivo de configuração para o assembly, Ngen.exe o usará. Além de isso, imagens nativas são geradas para todos os arquivos .dll a que ClientApp.exe
faz referência.
ngen install ClientApp.exe
Uma imagem instalada com Ngen.exe também é chamada de raiz. Uma raiz pode ser um aplicativo ou um componente compartilhado.
O comando a seguir gera uma imagem nativa para MyAssembly.exe
com o caminho especificado.
ngen install c:\myfiles\MyAssembly.exe
Para localizar assemblies e as suas dependências, Ngen.exe usa a mesma lógica de investigação usada pelo Common Language Runtime. Por padrão, o diretório que contém ClientApp.exe
é usado como diretório base do aplicativo, e toda investigação de assembly começa nesse diretório. É possível substituir esse comportamento usando-se a opção /AppBase
.
Observação
Essa é uma alteração no comportamento de Ngen.exe no .NET Framework versões 1.0 e 1.1, em que a base do aplicativo é definida como o diretório atual.
Um assembly pode ter uma dependência sem uma referência, por exemplo, se carregar um arquivo .dll usando o método Assembly.Load. É possível criar uma imagem nativa para esse arquivo .dll usando-se as informações de configuração do assembly do aplicativo, com a opção /ExeConfig
. O comando a seguir gera uma imagem nativa para MyLib.dll
usando as informações de configuração de MyApp.exe
.
ngen install c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe
Os assemblies instalados dessa forma não são removidos quando o aplicativo é removido.
Para desinstalar uma dependência, use as mesmas opções de linha de comando que foram usadas para instalá-la. O comando a seguir desinstala o MyLib.dll
do exemplo anterior.
ngen uninstall c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe
Para criar uma imagem nativa para um assembly no cache de assembly global, use o nome para exibição do assembly. Por exemplo:
ngen install "ClientApp, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"
NGen.exe gera um conjunto separado de imagens para cada cenário instalado. Por exemplo, os seguintes comandos instalam um conjunto completo de imagens nativas para operação normal, outro conjunto completo para depuração e um terceiro para criação de perfil:
ngen install MyApp.exe
ngen install MyApp.exe /debug
ngen install MyApp.exe /profile
Exibindo o Cache de Imagem Nativa
Depois de serem instaladas no cache, as imagens nativas poderão ser exibidas usando-se Ngen.exe. O comando a seguir exibe todas as imagens nativas no cache de imagem nativa.
ngen display
A ação display
lista todos os assemblies raiz primeiro, seguido de uma lista de todas as imagens nativas no computador.
Use o nome simples de um assembly para exibir informações somente desse assembly. O seguinte comando exibe todas as imagens nativas no cache de imagem nativa que correspondem ao nome parcial MyAssembly
, suas dependências e todas as raízes que tenham uma dependência em MyAssembly
:
ngen display MyAssembly
Saber quais raízes dependem de um assembly de componente compartilhado é útil na avaliação do impacto de uma ação update
depois que o componente compartilhado é atualizado.
Se especificar a extensão de arquivo de um assembly, você deverá especificar o caminho ou executar Ngen.exe no diretório que contém o assembly:
ngen display c:\myApps\MyAssembly.exe
O comando a seguir exibe todas as imagens nativas no cache de imagem nativa com o nome MyAssembly
e a versão 1.0.0.0.
ngen display "myAssembly, version=1.0.0.0"
Atualizando Imagens
As imagens normalmente são atualizadas depois que um componente compartilhado é atualizado. Para atualizar todas as imagens nativas alteradas, ou cujas dependências foram alteradas, use a ação update
sem argumentos.
ngen update
A atualização de todas as imagens pode ser um processo demorado. É possível enfileirar as atualizações para execução pelo serviço de imagem nativa usando-se a opção /queue
. Para obter mais informações sobre a opção /queue
e as prioridades de instalação, consulte Serviço de imagem nativa.
ngen update /queue
Desinstalando Imagens
Como Ngen.exe mantém uma lista de dependências, os componentes compartilhados só são removidos quando todos os assemblies que dependam dele forem removidos. Além de isso, um componente compartilhado não será removido se tiver sido instalado como raiz.
O seguinte comando desinstala todos os cenários da raiz ClientApp.exe
:
ngen uninstall ClientApp
A ação uninstall
pode ser usada para remover cenários específicos. O seguinte comando desinstala todos os cenários de depuração de ClientApp.exe
:
ngen uninstall ClientApp /debug
Observação
A desinstalação de cenários /debug
não desinstalará um cenário que inclua /profile
e /debug.
O seguinte comando desinstala todos os cenários de uma versão específica de ClientApp.exe
:
ngen uninstall "ClientApp, Version=1.0.0.0"
Os comandos a seguir desinstalam todos os cenários para "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"
o ou apenas o cenário de depuração para esse 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
Assim como acontece com a ação install
, o fornecimento de uma extensão exige a execução de Ngen.exe no diretório que contém o assembly ou a especificação de um caminho completo.
Para obter exemplos relacionados ao serviço de imagem nativa, consulte Serviço de imagem nativa.
Tarefa de imagem nativa
A tarefa de imagem nativa é uma tarefa do Windows que gera e mantém as imagens nativas. A tarefa de imagem nativa gera e recupera automaticamente as imagens nativas para cenários com suporte. Também permite que os instaladores usem o Ngen.exe (Gerador de imagens nativas) para criar e atualizar as imagens nativas em um tempo adiado.
A tarefa de imagem nativa é registrada uma vez para cada arquitetura de CPU com suporte em um computador, a fim de permitir a compilação para aplicativos direcionados a cada arquitetura:
Nome da tarefa | Computador de 32 bits | Computador de 64 bits |
---|---|---|
NET Framework NGEN v4.0.30319 | Sim | Sim |
NET Framework NGEN v4.0.30319 64 | No | Sim |
A tarefa de imagem nativa está disponível no .NET Framework 4.5 e em versões posteriores ao ser executado no Windows 8 ou versão mais recente. Em versões anteriores do Windows, o .NET Framework usa o Serviço de Imagem Nativa.
Tempo de vida da tarefa
Em geral, o Agendador de Tarefas do Windows inicia a tarefa de imagem nativa toda noite, quando o computador está ocioso. A tarefa procura qualquer trabalho adiado que foi enfileirado pelos instaladores de aplicativo, quaisquer solicitações de atualização de imagem nativa adiadas e qualquer criação automática de imagem. A tarefa conclui itens de trabalho pendentes e depois desliga. Se o computador deixar o estado ocioso durante a execução da tarefa, a tarefa será interrompida.
Você também pode iniciar manualmente a tarefa de imagem nativa por meio da interface de usuário do Agendador de Tarefas ou por chamadas manuais ao NGen.exe. Se a tarefa for iniciada por um desses métodos, ele continuará em execução quando o computador não estiver mais ocioso. As imagens criadas manualmente com o NGen.exe recebem prioridade para permitir o comportamento previsível para os instaladores de aplicativos.
Serviço de imagens nativas
O serviço de imagem nativa é um serviço do Windows que gera e mantém as imagens nativas. Com o serviço de imagem nativa, o desenvolvedor pode adiar a instalação e a atualização de imagens nativas para quando o computador estiver ocioso.
Normalmente, o serviço de imagem nativa é iniciado pelo programa de instalação (instalador) para um aplicativo ou atualização. Para ações de prioridade 3, o serviço é executado durante o período ocioso do computador. O serviço salva seu estado e é capaz de continuar através de várias reinicializações, se for necessário. É possível enfileirar várias compilações de imagem.
O serviço também interage com o comando manual Ngen.exe. Comandos manuais têm precedência sobre a atividade em segundo plano.
Observação
No Windows Vista, o nome exibido para o serviço de imagem nativa é "Microsoft.NET Framework NGEN v2.0.50727_X86" ou "Microsoft.NET Framework NGEN v2.0.50727_X64". Em todas as versões anteriores do Microsoft Windows, o nome é ".NET Runtime Optimization Service v2.0.50727_X86" ou ".NET Runtime Optimization Service v2.0.50727_X64".
Iniciar operações adiadas
Antes de iniciar uma instalação ou atualização, recomendamos pausar o serviço. Isso garante que o serviço não seja executado enquanto o instalador está copiando os arquivos ou colocando os assemblies no cache de assembly global. Esta linha de comando do Ngen.exe pausa o serviço:
ngen queue pause
Quando todas as operações adiadas tiverem sido enfileiradas, o comando a seguir permitirá que o serviço continue:
ngen queue continue
Para adiar a geração de imagem nativa ao instalar um novo aplicativo ou ao atualizar um componente compartilhado, use a opção /queue
com as ações install
ou update
. Estas linhas de comando do Ngen.exe instalam uma imagem nativa para um componente compartilhado e executam uma atualização de todas as raízes que foram afetadas:
ngen install MyComponent /queue
ngen update /queue
A ação update
gera novamente todas as imagens nativas que foram invalidadas, não apenas as que usam MyComponent
.
Se o seu aplicativo for composto por várias raízes, você poderá controlar a prioridade das ações adiadas. Os comandos a seguir enfileiram a instalação de três raízes. O Assembly1
é instalado primeiro, sem aguardar o tempo ocioso. O Assembly2
também é instalado sem esperar o tempo ocioso, mas somente após a conclusão de todas as ações de prioridade 1. O Assembly3
é instalado quando o serviço detecta que o computador está ocioso.
ngen install Assembly1 /queue:1
ngen install Assembly2 /queue:2
ngen install Assembly3 /queue:3
Você pode forçar a ocorrência assíncrona de ações enfileiradas usando a ação executeQueuedItems
. Se você fornecer a prioridade opcional, essa ação afetará somente as ações enfileiradas que têm prioridade igual ou menor. A prioridade padrão é a 3, portanto, o seguinte comando Ngen.exe processa todas as ações em fila imediatamente e não retorna até que todas sejam concluídas:
ngen executeQueuedItems
Os comandos síncronos são executados pelo Ngen.exe e não usam o serviço de imagem nativa. Você pode executar ações usando Ngen.exe enquanto o serviço de imagem nativa estiver em execução.
Desligamento do serviço
Depois de iniciado pela execução de um comando Ngen.exe que inclui a opção /queue
, o serviço é executado em segundo plano até que todas as ações sejam concluídas. O serviço salva seu estado para que ele possa continuar por várias reinicializações, se for necessário. Quando o serviço detecta que há não mais ações na fila, ele redefine seu status para que não reinicie na próxima vez que o computador for inicializado e, depois, ele se desliga.
Interação do serviço com clientes
No .NET Framework versão 2.0, a única interação com o serviço de imagem nativa ocorre por meio da ferramenta de linha de comando Ngen.exe. Use a ferramenta de linha de comando em scripts de instalação para enfileirar ações para o serviço de imagem nativa e para interagir com o serviço.