Versionen-Kontrollen zwischen Assemblies

Beim Erstellen des Konzepts für unsere neue .NET-basierte Software-Entwicklungs-Umgebung stand ich vor der Frage, ob das .NET-Framework Versionen- und Abhängigkeits-Prüfungen zwischen Assemblies durchführt, und wenn ja, welche. Dabei ging es um ganz „normale“ Assemblies, also solche ohne einen strong name bzw. um solche, die sich nicht im GAC (global assembly cache) befinden.

Weil ich weder in der Studio-Dokumentation noch auf dem Internet schlaue Informationen zu diesem Thema finden konnte, habe ich selbst einige Experimente durchgeführt, deren Resultat mich doch etwas überrascht hat.

Es hat sich herausgestellt, dass das .NET-Framework solche Assemblies beim Laden völlig dynamisch auf der Stufe einzelner Methoden verknüpft, und dass alles andere ziemlich egal ist, sofern alle benötigten Methoden da sind.

Es beginnt damit, dass man in einer .NET-basierten Applikation nach dem Setup ein Assembly ohne Folgen „manuell“ d.h. einfach durch Überschreiben des Files austauschen kann. Es gibt offenbar keinerlei Registry-Einträge, Konsistenz-Prüfungen oder ähnliches, welche einen hiervon abhalten.

Das Fehlen einer Methode war die einzige Art, wie ich das System soweit bringen konnte, dass es nicht mehr funktionierte. Die Version, die man bei den Projekteigenschaften für ein Assembly angeben kann, wird auf jeden Fall nicht für Versionen-Prüfungen herangezogen: Man kann bei mehreren, voneinander abhängigen Assemblies eine davon durch eine neue Version austauschen, ohne dass sich die anderen davon beeindrucken liessen.

Man kann Code in einer Assembly haben, der eine Klasse verwendet, die in einer zweiten Assembly steckt, danach hingehen, diese Klasse erweitern, und in der bereits installierten Applikation der ersten Assembly eine neue zweite mit der erweiterten Klasse unterjubeln, und alles funktioniert, egal wieviele Instanz-Variablen, Properties und Methoden die Klasse dazubekommen hat.

Sie mögen sich fragen, wieso ich diese Fragen überhaupt abgeklärt habe. Es ist einfach gut zu wissen, dass man in einer grossen Applikation, die aus Dutzenden von Assemblies besteht, nicht zwangsweise ein Setup durchführen muss, sondern in einem Notfall gezielt auf File-Ebene eine bestimmte Assembly mit einem Bug drin durch eine korrigierte ersetzen kann – sofern man natürlich weiss, was man tut!

Veröffentlicht in Keine Kategorie. Schlagwörter: , , . Leave a Comment »

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: