Laden...

Austausch einer DLL durch eine neue Version: Die referenzierende EXE läuft trotzdem noch. Warum?

Erstellt von AtzeX vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.445 Views
A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 10 Jahren
Austausch einer DLL durch eine neue Version: Die referenzierende EXE läuft trotzdem noch. Warum?

Hallo.

Ich hätte eine Frage zur Verwendung von Assemblies (DLL) in anderen Projekten:

Ich habe ein Library-Projekt "L", welches ausschließlich eine DLL mit einer statischen Methoden "M" erstellt.

Diese Assembly (DLL-Datei) habe ich nun in einem Konsolen-Projekt "K" referenziert und nutze die Methode "M" darin.
Das Projekt "K" habe ich nun ebenfalls kompiliert und die EXE mit der DLL in einen anderen Ordner "O" kopiert.

Nun habe ich das Projekt "L" modifiziert, indem ich weitere Methoden mit unterschiedlichsten Namen und Signaturen hinzugefügt, sowie die Assembly- und Dateiversion inkrementiert habe.
Das neue Kompilat (die DLL) habe ich nun in den Ordner "O" kopiert und die alte DLL damit überschrieben.

Womit ich nicht gerechnet hätte:
Die EXE lässt sich nach wie vor starten und läuft sauber.

Warum ist das so?

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo AtzeX,

kurz: da sich K nur für das M aus L interessiert. Solange das M in L gleich bleibt, kann K also damit umgehen. Würdest du in M eine "breaking change" (wie z.B. Änderung der Signatur) machen, so geht K nicht mehr.

Es kommt jedoch darauf an, wie K L referenziert bzw. wie die Referenz im Manifest von K hinterlegt ist. Schau dir in VS das Eigenschaftsfenster bei den Referenzen an. Dort kannst du z.B. einstellen ob eine "spezifische Version" verwendet werden soll od. nicht. Bei einer spez. Version kann K nur mit genau dem L umgehen, gegen das es kompiliert wurde.

Bei Strong-named Assemblys können die letzten Versionsnummern geändert werden ohne eine "breaking change" zu erzeugen. K kann also mit L.
Wird jedoch die Major- od. Minor-Version inkrementiert, so kann K nicht mehr mit dem neuen L, da es eben eine andere "Version" ist.
Würde die Strong-named Assembly im GAC liegen, so holt sich K das passende L aus dem GAC (sofern alle Versionen dort registriert und vorhanden sind).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 10 Jahren

Danke für die schnelle Antwort!

Ich könnte also "L" beliebig 'aufbohren', auch um Klassen mit non-static Members erweitern usw., und "K" würde "L" weiterhin ohne Murren akzeptieren solange der Name und die Signatur von "M" gleich bleibt (gehört der Name eigentlich auch zur Signatur? 😃 )?

Edit:
Habe gerade gesehen, dass du editiert hast. Lese noch mal schnell durch. 😉

Edit2:
Ok, danke für die Ergänzung.
Aber im zuerst skizzierten Fall von dir, also ohne speziell referenzierte Version, würde meine Frage oben positiv beantwortet werden können?

849 Beiträge seit 2006
vor 10 Jahren

Hallo,

der Name Gehört nicht zur Signatur, aber zum Full Qualified Name wenn Du denn änderst wird die dll nicht mehr gefunden.

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo AtzeX,

mit "E" meinst du wohl "K" 😉

könnte also "L" beliebig 'aufbohren', ...solange der Name und die Signatur von "M" gleich bleibt

Ja. Siehe auch obigen Hinweis zu den Versionen.

gehört der Name eigentlich auch zur Signatur?

Ja. Genauere Info: Definition of a method signature? (Schlag aber solche Fragen bitte selbst nach. Siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.

Hallo unconnected,

Signatur bezieht sich auf "Methode" und nicht auf "Assembly" od. "Typ", daher ist deine Antwort nur nach dem , korrekt 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

A
AtzeX Themenstarter:in
217 Beiträge seit 2006
vor 10 Jahren

Vielen Dank!

Und ja, ich meinte natürlich "K" und nicht "L". Hab's schnell korrigiert. 😉

Bzgl. der Signatur hätte ich in der Tat selber nachschauen können, aber das war ja eher eine 'spontane Zwischenfrage'. 😉

C
8 Beiträge seit 2013
vor 10 Jahren

Hallo,
Lass mich das kurz erklären. Wenn du einen Verweis in dein Projekt inkludierst hast du verschiedene Optionen für den Verweis. Eines der Optionen ist

bool Spefizischer_Verweis{get;set;}

Die Option besagt(false) den PK Token zu ignorieren und das Assembly zu akzeptieren wenn die Major Versions Number(fallweise PK Token) übereinstimmt. Ansonsten(false) wird das Assembly auch dem Namen nach akzeptiert, unabhänging von Version oder KeyToken. Das Assembly wird in keinem Fall(niemas) akzeptiert wenn es die falsche Major Versions Number aufweist

Vereinfacht gesagt: Wenn du deine Verweise genauer kontrollieren möchtest, dann kannst du das über die Verweiseigenschaften. Setze die Verweiseiegenschaft "Spezific Version" auf true und wenn du kannst dann signierere deine Abhängigkeiten.

Last Option:
Das Assembly.CurrentAssembly.ResolveAssembly Event gibt dir einige advanced options. Bitte suchen/googlen oder nochmal konkret fragen.