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?
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!"
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?
Hallo,
der Name Gehört nicht zur Signatur, aber zum Full Qualified Name wenn Du denn änderst wird die dll nicht mehr gefunden.
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!"
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'. 😉
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.