Erstellen von Schattenkopien von Assemblys

Schattenkopien sorgen dafür, dass Assemblys, die in einer Anwendungsdomäne verwendet werden, aktualisiert werden können, ohne die Anwendungsdomäne zu entladen. Dies ist besonders hilfreich für Anwendungen, die permanent verfügbar sein müssen, wie ASP.NET-Websites.

Wichtig

Schattenkopien werden in Windows 8.x-Store-Apps nicht unterstützt.

Die Common Language Runtime sperrt eine Assemblydatei, wenn die Assembly geladen ist, daher kann die Datei erst aktualisiert werden, wenn die Assembly entladen wurde. 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.

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. Die Kopie wird gesperrt, aber die ursprüngliche Assemblydatei wird entsperrt und kann aktualisiert werden.

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. Von Assemblys, die im globalen Assemblycache gespeichert sind, werden keine Schattenkopien erstellt.

Dieser Artikel enthält folgende Abschnitte:

  • Aktivieren und Verwenden der Schattenkopiefunktion beschreibt die grundlegende Verwendung sowie die Optionen in Verbindung mit Schattenkopien.

  • 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.

  • Veraltete Methoden beschreibt die Änderungen, die an den Eigenschaften und Methoden vorgenommen wurden, die die Schattenkopiefunktion in .NET Framework 2.0 steuern.

Aktivieren und Verwenden der Schattenkopiefunktion

Sie können die Eigenschaften der AppDomainSetup-Klasse wie folgt verwenden, um eine Anwendungsdomäne für Schattenkopien zu konfigurieren:

  • Aktivieren Sie die Schattenkopiefunktion, indem Sie die ShadowCopyFiles-Eigenschaft auf den Zeichenfolgenwert "true" festlegen.

    Standardmäßig bewirkt diese Einstellung, dass alle Assemblys im Anwendungspfad in einen Downloadcache kopiert werden, bevor sie geladen werden. 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.

  • Legen Sie optional einen benutzerdefinierten Speicherort für die Schattenkopien von Dateien fest, indem Sie die Eigenschaften CachePath und ApplicationName verwenden.

    Der Basispfad für den Speicherort wird gebildet, indem die Eigenschaft ApplicationName mit der Eigenschaft CachePath als Unterverzeichnis verkettet wird. Schattenkopien von Assemblys werden in die Unterverzeichnisse dieses Pfades gesetzt und nicht in den Basispfad selbst.

    Hinweis

    Wenn die ApplicationName-Eigenschaft nicht festgelegt wird, wird die CachePath-Eigenschaft ignoriert und der Downloadcache wird verwendet. Es werden keine Ausnahmen ausgelöst.

    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. Sie werden nicht automatisch gelöscht.

    Es gibt einige Gründe, warum Sie ggf. einen benutzerdefinierten Speicherort für Schattenkopien von Dateien anlegen sollten. Möglicherweise möchten Sie einen benutzerdefinierten Speicherort für Schattenkopien von Dateien anlegen, wenn Ihre Anwendung eine große Anzahl Kopien erstellt. 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. 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.

  • Begrenzen Sie optional die Assemblys, von denen Schattenkopien erstellt werden, indem Sie die ShadowCopyDirectories-Eigenschaft verwenden.

    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. 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. Trennen Sie die Verzeichnisse mit Semikolons. Die einzigen Assemblys, von denen Schattenkopien erstellt werden, sind nun die in den ausgewählten Verzeichnissen.

    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.

    Wichtig

    Verzeichnispfade dürfen keine Semikolons enthalten, da das Semikolon das Trennzeichen ist. Es gibt kein Escapezeichen für Semikolons.

Startleistung

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. Vor .NET Framework 4.0 wurden alle Assemblys in ein temporäres Verzeichnis kopiert. Jede Assembly wurde geöffnet, um den Assemblynamen zu überprüfen, und der starke Name wurde validiert. Jede Assembly wurde überprüft, um zu sehen, ob sie aktueller als die Kopie im Schattenkopieverzeichnis ist. Falls ja, wurde sie in das Schattenkopieverzeichnis kopiert. Abschließend wurden die temporären Kopien verworfen.

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. 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.

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. Wenn ein Großteil der Assemblys in einer Anwendung häufig geändert wird, kann das neue Standardverhalten zu einem Leistungsverlust führen. Sie können das Startverhalten vorheriger Versionen von .NET Framework wiederherstellen, indem Sie der Konfigurationsdatei mit enabled="false" das <shadowCopyVerifyByTimestamp>-Element hinzufügen.

Veraltete Methoden

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 markiert. Die empfohlenen Methode zum Konfigurieren einer Anwendungsdomäne für die Schattenkopiefunktion besteht drin, die Eigenschaften der AppDomainSetup-Klasse zu verwenden.

Siehe auch