2017-08-29 2 views
0

Ich habe über die Architekturansicht unserer von ReSharper erstellten Lösung geschaut, als ich bemerkte, dass einige der Projektreferenzen keine Kompilierungszeitverwendungen hatten, bedeutet das, dass ich Assemblys ändern kann zur Laufzeit?Referenz hat keine Kompilierungsnutzungen

Antwort

1

In einfachen Worten bedeutet Kompilierungszeit, dass Ihr Code kompiliert wird, selbst wenn Sie die Referenz entfernen. Aus dieser Anweisung können Sie nichts direkt zur Laufzeit ableiten. Es kann sogar sein, dass Ihre Anwendung völlig in Ordnung ist, wenn Sie diese Referenz einfach entfernen. Es kann auch sein, dass Ihre Referenz etwas verschleiert ist und der Compiler das nicht weiß. Dies kann daran liegen, dass der Verweis Schnittstellen implementiert, mit denen Sie kompilieren, oder Sie zur Laufzeit manuell suchen (siehe Antwort von Florian). Sie könnten es wahrscheinlich auch mit Nachdenken verbergen, wenn Sie wirklich wollten. Aber das müsste auch die Assembly manuell zur Laufzeit laden.

Zur Kompilierungszeit verknüpft der Compiler die neuen Binärdateien mit dem entsprechenden Code in den referenzierten Assemblys. Dies ermöglicht das automatische Laden der Assembly zur Laufzeit. Es kopiert auch konstante Werte in Ihre Assembly.

Sie können die referenzierte Assembly definitiv zwischen Kompilier- und Laufzeit ändern, obwohl Sie sehr vorsichtig vorgehen sollten. Wenn sich Methodensignaturen geändert haben, werden die Kompilierungszeitreferenzen unterbrochen.

Zur Laufzeit werden referenzierte Assemblys geladen, sobald Sie versuchen, mit ihnen zu interagieren. Sobald eine Baugruppe geladen ist, kann sie nicht direkt entladen werden. Sie können AppDomains nur entladen. Wenn Sie also Assemblys zur Laufzeit ändern möchten, schauen Sie in AppDomains nach.

Also was könnte eine beabsichtigte Verwendung dieser Nicht-Kompilierzeit-Referenzen sein? Die häufigste Architektur, die dies verwendet, wurde von Florian in der anderen Antwort erwähnt: Plugins. Auch andere Abhängigkeiten, bei denen Sie Ihren Code von der eigentlichen Implementierung über Schnittstellen trennen möchten. Ihre Projektreferenzen ohne Kompilierzeitabhängigkeiten dienen dann nur dazu, die Implementierung an die eigentliche Anwendung zu liefern. Andernfalls müssten Sie dies zu Ihrem Liefer- und Debugging-Prozess hinzufügen, was je nach Projekt sehr mühsam sein kann.

+0

Also kompiliere ich meine Lösung mit Projekten darin. Sie sind Baugruppen jetzt in meinem Arbeitsverzeichnis. Also in meiner Lösung habe ich 2 Projekte ohne Kompilierzeit verwendet, bedeutet das, dass ich 1 dieser Projekte separat kompilieren kann (nicht die gesamte Lösung) und jetzt habe ich Arbeitsverzeichnis (mit alter Version von Projekt 1 Assembly) und neu erstellt Assembly von Projekt 1. Sie sagen also, dass ich die neu erstellte Assembly mit der alten in meinem Arbeitsverzeichnis ändern kann, während der Prozess noch läuft (vielleicht eine kleine Zeit Ausfallzeit), indem ich mit AppDomains spiele? – kuskmen

+0

Der springende Punkt dabei ist, eine möglichst geringe Ausfallzeit zu erreichen, ohne dass eine neue Instanz dieses Prozesses gestartet werden muss, weil zum Beispiel meine Lösung viel Zeit zum Kompilieren/Optimieren braucht usw. Ich möchte diesen Prozess nicht durchlaufen Jedes Mal, wenn ich eine Änderung an einem Projekt vornahm, das keine Kompilierzeit hat, verwendet man – kuskmen

+0

. Ja, wenn Sie AppDomains verwenden, sollten Sie in der Lage sein, eine Logik einzurichten, um dies zu erreichen. Betrachten Sie z.B. https://www.brad-smith.info/blog/archives/500 für einige Ideen –