Erstellen von Schattenkopien von AssemblysShadow Copying Assemblies

Schattenkopien sorgen dafür, dass Assemblys, die in einer Anwendungsdomäne verwendet werden, aktualisiert werden können, ohne die Anwendungsdomäne zu entladen.Shadow copying enables assemblies that are used in an application domain to be updated without unloading the application domain. Dies ist besonders hilfreich für Anwendungen, die permanent verfügbar sein müssen, wie ASP.NET-Websites.This is particularly useful for applications that must be available continuously, such as ASP.NET sites.

Wichtig

Schattenkopien werden in Windows 8.x-Store-Apps nicht unterstützt.Shadow copying is not supported in Windows 8.x Store apps.

Die Common Language Runtime sperrt eine Assemblydatei, wenn die Assembly geladen ist, daher kann die Datei erst aktualisiert werden, wenn die Assembly entladen wurde.The common language runtime locks an assembly file when the assembly is loaded, so the file cannot be updated until the assembly is unloaded. Die einzige Möglichkeit zum Entladen einer Assembly aus einer Anwendungsdomäne besteht darin, die Anwendungsdomäne zu entladen, sodass eine Assembly unter normalen Umständen erst auf dem Datenträger aktualisiert werden kann, wenn alle Anwendungsdomänen, in der sie genutzt wird, entladen wurden.The only way to unload an assembly from an application domain is by unloading the application domain, so under normal circumstances, an assembly cannot be updated on disk until all the application domains that are using it have been unloaded.

Wenn eine Anwendungdomäne für die Erstellung von Schattenkopien von Dateien konfiguriert ist, werden Assemblys aus dem Anwendungspfad an einen anderen Speicherort kopiert und von dort aus geladen.When an application domain is configured to shadow copy files, assemblies from the application path are copied to another location and loaded from that location. Die Kopie wird gesperrt, aber die ursprüngliche Assemblydatei wird entsperrt und kann aktualisiert werden.The copy is locked, but the original assembly file is unlocked and can be updated.

Wichtig

Die einzigen Assemblys, von denen Schattenkopien erstellt werden können, sind diejenigen, die im Anwendungsverzeichnis oder dessen Unterverzeichnissen gespeichert sind, die bei der Konfiguration der Anwendungsdomäne von den Eigenschaften ApplicationBase und PrivateBinPath festgelegt werden.The only assemblies that can be shadow copied are those stored in the application directory or its subdirectories, specified by the ApplicationBase and PrivateBinPath properties when the application domain is configured. Von Assemblys, die im globalen Assemblycache gespeichert sind, werden keine Schattenkopien erstellt.Assemblies stored in the global assembly cache are not shadow copied.

Dieser Artikel enthält folgende Abschnitte:This article contains the following sections:

  • Aktivieren und Verwenden der Schattenkopiefunktion beschreibt die grundlegende Verwendung sowie die Optionen in Verbindung mit Schattenkopien.Enabling and Using Shadow Copying describes the basic use and the options that are available for shadow copying.

  • Startleistung beschreibt die Änderungen, die an der Schattenkopiefunktion in .NET Framework 4 vorgenommen werden, um die Startleistung zu verbessern. Außerdem wird erläutert, wie das Verhalten vorheriger Versionen wiederhergestellt werden kann.Startup Performance describes the changes that are made to shadow copying in the .NET Framework 4 to improve startup performance, and how to revert to the behavior of earlier versions.

  • Veraltete Methoden beschreibt die Änderungen, die an den Eigenschaften und Methoden vorgenommen wurden, die die Schattenkopiefunktion in .NET Framework 2.0 steuern.Obsolete Methods describes the changes that were made to the properties and methods that control shadow copying in the .NET Framework 2.0.

Aktivieren und Verwenden der SchattenkopiefunktionEnabling and Using Shadow Copying

Sie können die Eigenschaften der AppDomainSetup-Klasse wie folgt verwenden, um eine Anwendungsdomäne für Schattenkopien zu konfigurieren:You can use the properties of the AppDomainSetup class as follows to configure an application domain for shadow copying:

  • Aktivieren Sie die Schattenkopiefunktion, indem Sie die ShadowCopyFiles-Eigenschaft auf den Zeichenfolgenwert "true" festlegen.Enable shadow copying by setting the ShadowCopyFiles property to the string value "true".

    Standardmäßig bewirkt diese Einstellung, dass alle Assemblys im Anwendungspfad in einen Downloadcache kopiert werden, bevor sie geladen werden.By default, this setting causes all assemblies in the application path to be copied to a download cache before they are loaded. Dies ist der gleiche Cache, der von der Common Language Runtime zum Speichern von Dateien verwendet wird, die von anderen Computern heruntergeladen wurden, und die Common Language Runtime löscht diese Dateien automatisch, wenn sie nicht mehr benötigt werden.This is the same cache maintained by the common language runtime to store files downloaded from other computers, and the common language runtime automatically deletes the files when they are no longer needed.

  • Legen Sie optional einen benutzerdefinierten Speicherort für die Schattenkopien von Dateien fest, indem Sie die Eigenschaften CachePath und ApplicationName verwenden.Optionally set a custom location for shadow copied files by using the CachePath property and the ApplicationName property.

    Der Basispfad für den Speicherort wird gebildet, indem die Eigenschaft ApplicationName mit der Eigenschaft CachePath als Unterverzeichnis verkettet wird.The base path for the location is formed by concatenating the ApplicationName property to the CachePath property as a subdirectory. Schattenkopien von Assemblys werden in die Unterverzeichnisse dieses Pfades gesetzt und nicht in den Basispfad selbst.Assemblies are shadow copied to subdirectories of this path, not to the base path itself.

    Hinweis

    Wenn die ApplicationName-Eigenschaft nicht festgelegt wird, wird die CachePath-Eigenschaft ignoriert und der Downloadcache wird verwendet.If the ApplicationName property is not set, the CachePath property is ignored and the download cache is used. Es werden keine Ausnahmen ausgelöst.No exception is thrown.

    Wenn Sie einen benutzerdefinierten Speicherort festlegen, sind Sie selbst für die Bereinigung der Verzeichnisse und das Löschen der kopierten Dateien zuständig, wenn diese nicht mehr benötigt werden.If you specify a custom location, you are responsible for cleaning up the directories and copied files when they are no longer needed. Sie werden nicht automatisch gelöscht.They are not deleted automatically.

    Es gibt einige Gründe, warum Sie ggf. einen benutzerdefinierten Speicherort für Schattenkopien von Dateien anlegen sollten.There are a few reasons why you might want to set a custom location for shadow copied files. Möglicherweise möchten Sie einen benutzerdefinierten Speicherort für Schattenkopien von Dateien anlegen, wenn Ihre Anwendung eine große Anzahl Kopien erstellt.You might want to set a custom location for shadow copied files if your application generates a large number of copies. Der Downloadcache ist in der Größe und nicht in der Lebensdauer begrenzt, daher ist es möglich, dass die Common Language Runtime versucht, eine Datei zu löschen, die noch verwendet wird.The download cache is limited by size, not by lifetime, so it is possible that the common language runtime will attempt to delete a file that is still in use. Ein weiterer Grund für das Einrichten eines benutzerdefinierten Speicherorts ist folgender: Wenn Benutzer, die Ihre Anwendung ausführen, keinen Schreibzugriff auf den Verzeichnisspeicherort haben, den die Common Language Runtime als Downloadcache verwendet.Another reason to set a custom location is when users running your application do not have write access to the directory location the common language runtime uses for the download cache.

  • Begrenzen Sie optional die Assemblys, von denen Schattenkopien erstellt werden, indem Sie die ShadowCopyDirectories-Eigenschaft verwenden.Optionally limit the assemblies that are shadow copied by using the ShadowCopyDirectories property.

    Wenn Sie die Schattenkopiefunktion für eine Anwendungsdomäne aktivieren, werden standardmäßig alle Assemblys im Anwendungspfad kopiert, d. h. in den Verzeichnissen, die von den Eigenschaften ApplicationBase und PrivateBinPath festgelegt wurden.When you enable shadow copying for an application domain, the default is to copy all assemblies in the application path — that is, in the directories specified by the ApplicationBase and PrivateBinPath properties. Sie können den Kopiervorgang auf ausgewählte Verzeichnisse beschränken, indem Sie eine Zeichenfolge erstellen, der nur die Verzeichnisse enthält, in denen Schattenkopien erstellt werden sollen. Weisen Sie die Zeichenfolge dann der ShadowCopyDirectories-Eigenschaft zu.You can limit the copying to selected directories by creating a string that contains only those directories you want to shadow copy, and assigning the string to the ShadowCopyDirectories property. Trennen Sie die Verzeichnisse mit Semikolons.Separate the directories with semicolons. Die einzigen Assemblys, von denen Schattenkopien erstellt werden, sind nun die in den ausgewählten Verzeichnissen.The only assemblies that are shadow copied are the ones in the selected directories.

    Hinweis

    Wenn Sie der ShadowCopyDirectories-Eigenschaft keine Zeichenfolge zuweisen oder wenn Sie diese Eigenschaft nicht auf null festlegen, werden von allen Assemblys in den Verzeichnissen, die mit den Eigenschaften ApplicationBase und PrivateBinPath angegeben werden, Schattenkopien erstellt.If you don’t assign a string to the ShadowCopyDirectories property, or if you set this property to null, all assemblies in the directories specified by the ApplicationBase and PrivateBinPath properties are shadow copied.

    Wichtig

    Verzeichnispfade dürfen keine Semikolons enthalten, da das Semikolon das Trennzeichen ist.Directory paths must not contain semicolons, because the semicolon is the delimiter character. Es gibt kein Escapezeichen für Semikolons.There is no escape character for semicolons.

StartleistungStartup Performance

Wenn eine Anwendungsdomäne, in der die Schattenkopiefunktion verwendet wird, gestartet wird, kommt es zu einer Verzögerung, während die Assemblys im Anwendungsverzeichnis in das Verzeichnis für Schattenkopien kopiert oder während überprüft wird, ob sie sich bereits an diesem Speicherort befinden.When an application domain that uses shadow copying starts, there is a delay while assemblies in the application directory are copied to the shadow copy directory, or verified if they are already in that location. Vor .NET Framework 4.0 wurden alle Assemblys in ein temporäres Verzeichnis kopiert.Before the .NET Framework 4, all assemblies were copied to a temporary directory. Jede Assembly wurde geöffnet, um den Assemblynamen zu überprüfen, und der starke Name wurde validiert.Each assembly was opened to verify the assembly name, and the strong name was validated. Jede Assembly wurde überprüft, um zu sehen, ob sie aktueller als die Kopie im Schattenkopieverzeichnis ist.Each assembly was checked to see whether it had been updated more recently than the copy in the shadow copy directory. Falls ja, wurde sie in das Schattenkopieverzeichnis kopiert.If so, it was copied to the shadow copy directory. Abschließend wurden die temporären Kopien verworfen.Finally, the temporary copies were discarded.

Ab .NET Framework 4 besteht das standardmäßige Startverhalten darin, Datum und Uhrzeit jeder Assembly im Anwendungsverzeichnis direkt mit dem Datum und der Uhrzeit der Kopie im Schattenkopieverzeichnis zu vergleichen.Beginning with the .NET Framework 4, the default startup behavior is to directly compare the file date and time of each assembly in the application directory with the file date and time of the copy in the shadow copy directory. Wenn die Assembly aktualisiert wurde, wird sie mit der gleichen Prozedur wie in älteren Versionen von .NET Framework kopiert; andernfalls wird die Schattenkopie im Schattenkopieverzeichnis geladen.If the assembly has been updated, it is copied by using the same procedure as in earlier versions of the .NET Framework; otherwise, the copy in the shadow copy directory is loaded.

Die sich hieraus ergebende Leistungsverbesserung ist enorm für Anwendungen, in denen Assemblys nicht häufig geändert werden und Änderungen in der Regel nur an einer kleinen Teilmenge von Assemblys vorgenommen werden.The resulting performance improvement is largest for applications in which assemblies do not change frequently and changes usually occur in a small subset of assemblies. Wenn ein Großteil der Assemblys in einer Anwendung häufig geändert wird, kann das neue Standardverhalten zu einem Leistungsverlust führen.If a majority of assemblies in an application change frequently, the new default behavior might cause a performance regression. Sie können das Startverhalten vorheriger Versionen des .NET Frameworks wiederherstellen, indem Sie das <shadowCopyVerifyByTimestamp>-Element mit enabled="false" zur Konfigurationsdatei hinzufügen.You can restore the startup behavior of previous versions of the .NET Framework by adding the <shadowCopyVerifyByTimestamp> element to the configuration file, with enabled="false".

Veraltete MethodenObsolete Methods

Die AppDomain-Klasse verfügt über mehrere Methoden, wie SetShadowCopyFiles und ClearShadowCopyPath, die verwendet werden können, um die Erstellung von Schattenkopien in einer Anwendungsdomäne zu steuern, diese wurde in .NET Framework 2.0 jedoch als veraltet deklariert.The AppDomain class has several methods, such as SetShadowCopyFiles and ClearShadowCopyPath, that can be used to control shadow copying on an application domain, but these have been marked obsolete in the .NET Framework version 2.0. Die empfohlenen Methode zum Konfigurieren einer Anwendungsdomäne für die Schattenkopiefunktion besteht drin, die Eigenschaften der AppDomainSetup-Klasse zu verwenden.The recommended way to configure an application domain for shadow copying is to use the properties of the AppDomainSetup class.

Siehe auchSee also