Partager via


Clichés instantanés d'assemblys

Remarque

Cet article est spécifique à .NET Framework. Elle ne s’applique pas aux implémentations plus récentes de .NET, notamment .NET 6 et versions ultérieures.

Les clichés instantanés permettent aux assemblys qui sont utilisés dans un domaine d'application d'être mis à jour sans décharger le domaine d'application. Cela est particulièrement utile pour les applications qui doivent être disponibles en continu, telles que les sites ASP.NET.

Importante

Les clichés instantanés ne sont pas pris en charge dans les applications Windows 8.x Store.

Le Common Language Runtime verrouille un fichier d’assembly lorsque l’assembly est chargé. Le fichier ne peut donc pas être mis à jour tant que l’assembly n’est pas déchargé. La seule façon de décharger un assembly à partir d’un domaine d’application consiste à décharger le domaine d’application. Par conséquent, dans des circonstances normales, un assembly ne peut pas être mis à jour sur le disque tant que tous les domaines d’application qui l’utilisent n’ont pas été déchargés.

Quand un domaine d'application est configuré pour effectuer un cliché instantané des fichiers, les assemblys du chemin d'accès de l'application sont copiés vers un autre emplacement et chargés à partir de cet emplacement. La copie est verrouillée, mais le fichier d’assembly d’origine est déverrouillé et peut être mis à jour.

Importante

Les seuls assemblages qui peuvent être copiés en mode ombre sont ceux stockés dans le répertoire de l’application ou ses sous-répertoires, spécifiés par les propriétés ApplicationBase et PrivateBinPath lorsque le domaine d’application est configuré. Les assemblys stockés dans le Global Assembly Cache ne sont pas l'objet de clichés instantanés.

Cet article contient les sections suivantes :

  • Activation et utilisation des clichés instantanés décrit l’utilisation de base et les options disponibles pour les clichés instantanés.

  • Le terme Performances de démarrage décrit les modifications apportées à la copie d'ombre dans le .NET Framework 4 pour améliorer les performances de démarrage, et comment revenir au comportement des versions antérieures.

  • Les méthodes obsolètes décrivent les modifications apportées aux propriétés et aux méthodes qui contrôlent la copie de l'ombre dans le .NET Framework 2.0.

Activation et utilisation des clichés instantanés

Vous pouvez utiliser les propriétés de la classe AppDomainSetup comme suit pour configurer un domaine d'application pour les clichés instantanés :

  • Activez les clichés instantanés en définissant la propriété ShadowCopyFiles à la valeur de chaîne "true".

    Par défaut, ce paramètre entraîne la copie de tous les assemblys du chemin d’accès de l’application dans un cache de téléchargement avant leur chargement. Il s’agit du même cache géré par le Common Language Runtime pour stocker les fichiers téléchargés à partir d’autres ordinateurs, et le Common Language Runtime supprime automatiquement les fichiers lorsqu’ils ne sont plus nécessaires.

  • Définissez un emplacement personnalisé pour les fichiers copiés en ombre, si vous le souhaitez, en utilisant la propriété CachePath et la propriété ApplicationName.

    Le chemin d'accès de base de l'emplacement est formé en concaténant la propriété ApplicationName à la propriété CachePath comme sous-répertoire. Les clichés instantanés des assemblys sont copiés vers des sous-répertoires de ce chemin d'accès, et non pas dans le chemin d'accès de base lui-même.

    Remarque

    Si la ApplicationName propriété n’est pas définie, la CachePath propriété est ignorée et le cache de téléchargement est utilisé. Aucune exception n’est générée.

    Si vous spécifiez un emplacement personnalisé, vous êtes responsable du nettoyage des répertoires et des fichiers copiés lorsqu’ils ne sont plus nécessaires. Ils ne sont pas supprimés automatiquement.

    Il existe plusieurs raisons pour lesquelles vous voudrez peut-être définir un emplacement personnalisé pour les fichiers de clichés instantanés. Vous pouvez définir un emplacement personnalisé pour les fichiers copiés en ombre si votre application génère un grand nombre de copies. Le cache de téléchargement est limité par taille, et non par durée de vie. Il est donc possible que le Common Language Runtime tente de supprimer un fichier qui est toujours en cours d’utilisation. Une autre raison de définir un emplacement personnalisé est que les utilisateurs qui exécutent votre application n’ont pas d’accès en écriture à l’emplacement du répertoire que le Common Language Runtime utilise pour le cache de téléchargement.

  • Limitez éventuellement les assemblys qui font l'objet de clichés instantanés en utilisant la propriété ShadowCopyDirectories.

    Lorsque vous activez la copie d'ombre pour un domaine d'application, la valeur par défaut consiste à copier tous les assemblys dans le chemin d'accès de l'application, c'est-à-dire dans les répertoires spécifiés par les propriétés ApplicationBase et PrivateBinPath. Vous pouvez limiter la copie aux répertoires sélectionnés en créant une chaîne qui contient uniquement les répertoires que vous souhaitez copier instantanément, puis en assignant cette chaîne à la propriété ShadowCopyDirectories. Séparez les répertoires par des points-virgules. Les seuls assemblys qui font l'objet de clichés instantanés sont alors ceux des répertoires sélectionnés.

    Remarque

    Si vous n’affectez pas de chaîne à la propriété ShadowCopyDirectories, ou si vous définissez cette propriété sur null, tous les assemblies des répertoires spécifiés par les propriétés ApplicationBase et PrivateBinPath sont copiés en ombre.

    Importante

    Les chemins d’accès au répertoire ne doivent pas contenir de points-virgules, car le point-virgule est le caractère délimiteur. Il n'existe pas de caractère d'échappement pour les points-virgules.

Performance des startups

Quand un domaine d'application qui utilise des clichés instantanés démarre, un certain délai est nécessaire pour que les assemblys du répertoire de l'application soient copiés dans le répertoire des clichés instantanés, ou pour qu'ils soient vérifiés s'ils se trouvent déjà à cet emplacement. Avant .NET Framework 4, tous les assemblys ont été copiés dans un répertoire temporaire. Chaque assembly était ouvert pour vérifier le nom de l'assembly et le nom fort était validé. Chaque assembly était vérifié pour voir s'il avait été mis à jour plus récemment que la copie du répertoire des clichés instantanés. Le cas échéant, il était copié dans le répertoire des clichés instantanés. Enfin, les copies temporaires ont été jetées.

À partir du .NET Framework 4, le comportement de démarrage par défaut consiste à comparer directement la date et l’heure du fichier de chaque assembly dans le répertoire de l’application avec la date et l’heure du fichier de la copie dans le répertoire de copie de sauvegarde. Si l’assembly a été mis à jour, il est copié en utilisant la même procédure que dans les versions antérieures du .NET Framework. Sinon, la copie dans le répertoire de copie fantôme est chargée.

L’amélioration des performances résultante est la plus importante pour les applications dans lesquelles les assemblys ne changent pas fréquemment et les modifications se produisent généralement dans un petit sous-ensemble d’assemblys. Si une majorité d’assemblys dans une application changent fréquemment, le nouveau comportement par défaut peut entraîner une régression des performances. Vous pouvez restaurer le comportement de démarrage des versions précédentes du .NET Framework en ajoutant l’élément<shadowCopyVerifyByTimestamp> au fichier de configuration, avec enabled="false".

Méthodes obsolètes

La AppDomain classe a plusieurs méthodes, telles que SetShadowCopyFiles et ClearShadowCopyPath, qui peuvent être utilisées pour contrôler la copie d'ombre sur un domaine d'application, mais elles ont été déclarées obsolètes dans la version 2.0 de .NET Framework. La méthode recommandée pour configurer un domaine d'application pour le shadow copying consiste à utiliser les propriétés de la classe AppDomainSetup.

Voir aussi