Compartilhar via


Fazendo cópias de sombra de assemblies

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

O Common Language Runtime bloqueia um arquivo de assembly quando o assembly é carregado para que o arquivo não possa ser atualizado até que o assembly seja descarregado. A única maneira de descarregar um assembly de um domínio de aplicativo é descarregar o domínio de aplicativo; assim, sob circunstâncias normais, um assembly não pode ser atualizado no disco até que todos os domínios de aplicativos que o estão usando tenham sido descarregados.

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

Observação importanteImportante

Os únicos assemblies dos quais podem ser feitas cópias de sombra são aqueles armazenados no diretório do aplicativo ou seus subdiretórios, especificados pelas propriedades ApplicationBase e PrivateBinPath quando o domínio de aplicativo é configurado.Assemblies armazenados no cache global de assemblies não estão sujeitos a cópias de sombra.

Este artigo contém as seções a seguir:

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

  • O desempenho de inicialização descreve as alterações efectuadas sombra copiando o .NET Framework versão 4 para melhorar o desempenho de inicialização e como reverter para o comportamento de versões anteriores.

  • Obsoleto métodos descreve as alterações que foram feitas as propriedades e métodos que cópias de sombra de controle no .NET Framework 2.0. 

Habilitação e a cópia de sombra usando

Você pode usar as propriedades de AppDomainSetup classe como a seguir para configurar um domínio de aplicativo para a cópia de sombra:

  • Ative a cópia de sombra definindo a propriedade ShadowCopyFiles para o valor de sequência de caracteres "true".

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

  • Opcionalmente, defina um local personalizado para os arquivos de cópia de sombra usando o CachePath propriedade e o ApplicationName propriedade.

    O caminho base para o local é formado concatenando a propriedade ApplicationName para a propriedade CachePath como uma subpasta. São feitas cópias de sombra de assemblies em subpastas nesse caminho, não no caminho base em si.

    Observação

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

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

    Há alguns motivos por que talvez você queira definir uma localização personalizada dos arquivos de cópia de sombra. É aconselhável definir uma localização personalizada dos arquivos de cópia de sombra se seu aplicativo gera 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 executando o seu aplicativo não têm acesso de gravação para o local do diretório que o Common Language Runtime usa para o cache de download.

  • Opcionalmente, limitar os assemblies que são copiada por meio de sombra a ShadowCopyDirectories propriedade.

    Quando você habilita cópias 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 pela ApplicationBase e PrivateBinPath Propriedades. Você pode limitar a cópia para diretórios selecionados Criando uma cadeia de caracteres que contém apenas nesses diretórios que você deseja a cópia de sombra e atribuir a seqüência de caracteres para o ShadowCopyDirectories propriedade. Separe os diretórios com ponto-e-vírgula. Os únicos assemblies dos quais são feitas cópias de sombra são aqueles nas pastas selecionadas.

    Observação

    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 o ponto e vírgula.

Desempenho de inicialização

Quando um domínio de aplicativo que usa cóopiar de sombra se inicia, há um intervalo enquanto os assemblies no diretório de aplicativo são copiados para o diretório de cópia de sombra, ou é verificado se eles já estão naquele local. Antes de .NET Framework 4, todos os assemblies foram copiados para um diretório temporário. Cada assembly era aberto para verificar o nome do assembly, e o strong name era validado. Cada assembly era checado para ver se ele foi atualizado mais recentemente do que a cópia de sombra no diretório de cópias de sombra. Se sim, ele era copiado para o diretório de cópias de sombra. Por fim, as cópias temporárias eram descartadas.

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

A melhoria de desempenho resultante é maior para aplicativos em que os assemblies não são alterados com freqüência e as alterações ocorrem normalmente em um pequeno subconjunto de módulos (assemblies). Se a maioria dos assemblies em uma aplicação mudam com freqüência, o novo comportamento padrão pode causar uma regressão de desempenho. Você pode restaurar o comportamento de inicialização de versões anteriores do.NET Framework, adicionando a <shadowCopyVerifyByTimestamp> elemento o arquivo de configuração com enabled="false".

Métodos Obsoletos

A classe AppDomain tem vários métodos, como SetShadowCopyFiles e ClearShadowCopyPath, que pode ser usado 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 para configurar um domínio de aplicativo para a cópia de sombra é usar as propriedades da classe AppDomainSetup.

Consulte também

Referência

AppDomainSetup.ShadowCopyFiles

AppDomainSetup.CachePath

AppDomainSetup.ApplicationName

AppDomainSetup.ShadowCopyDirectories

Outros recursos

<shadowCopyVerifyByTimestamp> Elemento