Partilhar via


Montagens de cópia de sombra

Nota

Este artigo é específico do .NET Framework. Ele não se aplica a implementações mais recentes do .NET, incluindo o .NET 6 e versões posteriores.

A cópia de sombra permite que assemblies usados em um domínio de aplicativo sejam atualizados sem descarregar o domínio do aplicativo. Isso é particularmente útil para aplicativos que devem estar disponíveis continuamente, como ASP.NET sites.

Importante

A cópia de sombra não é suportada nas aplicações da Loja Windows 8.x.

O common language runtime bloqueia um arquivo assembly quando o assembly é carregado, portanto, o arquivo não pode ser atualizado até que o assembly seja descarregado. A única maneira de descarregar um assembly de um domínio de aplicativo é descarregando o domínio do aplicativo, portanto, em circunstâncias normais, um assembly não pode ser atualizado no disco até que todos os domínios de aplicativo que o estão usando tenham sido descarregados.

Quando um domínio de aplicativo é configurado para arquivos de cópia de sombra, assemblies do caminho do aplicativo são copiados para outro local e carregados desse local. A cópia está bloqueada, mas o arquivo de montagem original é desbloqueado e pode ser atualizado.

Importante

Os únicos assemblies que podem ser copiados de sombra são aqueles armazenados no diretório do aplicativo ou em seus subdiretórios, especificados pelas ApplicationBase propriedades e PrivateBinPath quando o domínio do aplicativo é configurado. Os assemblies armazenados no cache de assembly global não são copiados de sombra.

Este artigo contém as seguintes seções:

  • Habilitando e usando cópia de sombra descreve o uso básico e as opções disponíveis para cópia de sombra.

  • O Desempenho de Inicialização descreve as alterações feitas na cópia de sombra no .NET Framework 4 para melhorar o desempenho de inicialização e como reverter para o comportamento de versões anteriores.

  • Métodos obsoletos descreve as alterações que foram feitas nas propriedades e métodos que controlam a cópia de sombra no .NET Framework 2.0.

Habilitando e usando a cópia de sombra

Você pode usar as propriedades da classe da seguinte maneira para configurar um domínio de aplicativo para cópia de AppDomainSetup sombra:

  • Habilite a cópia de sombra definindo a ShadowCopyFiles propriedade como o valor "true"da cadeia de caracteres .

    Por padrão, essa configuração faz com que todos os assemblies no caminho do aplicativo sejam copiados para um cache de download antes de serem carregados. Este é o mesmo cache mantido pelo common language runtime para armazenar arquivos baixados de outros computadores, e o common language runtime exclui automaticamente os arquivos quando eles não são mais necessários.

  • Opcionalmente, defina um local personalizado para arquivos copiados de sombra usando a propriedade e a CachePathApplicationName propriedade.

    O caminho base para o local é formado concatenando a ApplicationName propriedade para a CachePath propriedade como um subdiretório. Os assemblies são copiados de sombra para subdiretórios desse caminho, não para o caminho base em si.

    Nota

    Se a ApplicationName propriedade não estiver definida, a CachePath propriedade será ignorada e o cache de download será usado. Não é gerada nenhuma exceção.

    Se você especificar um local personalizado, será responsável por limpar os diretórios e os arquivos copiados quando eles não forem mais necessários. Eles não são excluídos automaticamente.

    Há algumas razões pelas quais você pode querer definir um local personalizado para arquivos copiados de sombra. Talvez você queira definir um local personalizado para arquivos copiados de sombra se seu aplicativo gerar um grande número de cópias. O cache de download é limitado pelo tamanho, não pelo tempo de vida, portanto, é possível que o common language runtime tente excluir um arquivo que ainda está em uso. Outro motivo para definir um local personalizado é quando os usuários que executam seu aplicativo não têm acesso de gravação ao local do diretório que o Common Language Runtime usa para o cache de download.

  • Opcionalmente, limite os assemblies que são copiados de sombra usando a ShadowCopyDirectories propriedade.

    Quando você habilita a cópia de sombra para um domínio de aplicativo, o padrão é copiar todos os assemblies no caminho do aplicativo — ou seja, nos diretórios especificados pelas ApplicationBase propriedades e PrivateBinPath . Você pode limitar a cópia aos diretórios selecionados criando uma cadeia de caracteres que contenha apenas os diretórios que você deseja copiar de sombra e atribuindo a cadeia de caracteres à ShadowCopyDirectories propriedade. Separe os diretórios com ponto-e-vírgula. Os únicos assemblies que são copiados de sombra são aqueles nos diretórios selecionados.

    Nota

    Se você não atribuir uma cadeia de caracteres à ShadowCopyDirectories propriedade ou definir essa propriedade como null, todos os assemblies nos diretórios especificados pelas ApplicationBase propriedades e PrivateBinPath serão copiados de sombra.

    Importante

    Os caminhos de diretório não devem conter ponto-e-vírgula, porque o ponto-e-vírgula é o caractere delimitador. Não há nenhum caractere de escape para ponto-e-vírgula.

Desempenho de inicialização

Quando um domínio de aplicativo que usa cópia de sombra é iniciado, há um atraso enquanto os assemblies no diretório do aplicativo são copiados para o diretório de cópia de sombra ou verificados se já estão nesse local. Antes do .NET Framework 4, todos os assemblies eram copiados para um diretório temporário. Cada assembly foi aberto para verificar o nome do assembly e o nome forte foi validado. Cada assembly foi verificado para ver se havia sido atualizado mais recentemente do que a cópia no diretório de cópia de sombra. Em caso afirmativo, ele foi copiado para o diretório de cópia de sombra. Por fim, as cópias temporárias foram descartadas.

Começando com o .NET Framework 4, o comportamento de inicialização padrão é comparar diretamente a data e a hora do arquivo de cada assembly no diretório do aplicativo com a data e a hora do arquivo da cópia no diretório de cópia de sombra. Se o assembly tiver sido atualizado, ele será copiado usando o mesmo procedimento que em versões anteriores do .NET Framework; caso contrário, a cópia no diretório de cópia de sombra será carregada.

A melhoria de desempenho resultante é maior para aplicativos nos quais os assemblies não mudam com freqüência e as alterações geralmente ocorrem em um pequeno subconjunto de assemblies. Se a maioria dos assemblies em um aplicativo for alterada com freqüência, o novo comportamento padrão poderá causar uma regressão de desempenho. Você pode restaurar o comportamento de inicialização de versões anteriores do .NET Framework adicionando o elemento shadowCopyVerifyByTimestamp> ao arquivo de configuração, com enabled="false".<

Métodos obsoletos

A AppDomain classe tem vários métodos, como SetShadowCopyFiles e ClearShadowCopyPath, que podem ser usados para controlar a cópia de sombra em um domínio de aplicativo, mas eles foram marcados como obsoletos no .NET Framework versão 2.0. A maneira recomendada de configurar um domínio de aplicativo para cópia de sombra é usar as AppDomainSetup propriedades da classe.

Consulte também