Hallo Community,
ich habe etwas mysteriöses festgestellt, was ich mir nicht erklären kann.
In meiner älteren Dll habe ich eine Funktion mit optionalen Parametern
public void f(string name, int nb = 0, int size = 0);
implementiert. In einer neueren Dll-Version habe ich die Funktion geändert in
public void f(string name, string path = null, int nb = 0, int size = 0);
Die neue Exe kompiliert mit der neuen Dll, funktioniert
obj.f("tmp");
Die alte Exe kompiliert mit der alten Dll, funktioniert
obj.f("tmp");
Auf einem Kundenrechner ist aber nun die neue Dll mit der alten Exe. Das funktioniert nicht. Die alte Exe hat sich irgendwo die alte Schnittstellenfunktionsdefinition gemerkt. Es kommt eine Meldung 'f(string, int, int)' nicht gefunden (obwohl nichts registriert wird). Komisch, oder.
Kann sich das jemand erklären?
Ich weiß, dass Schnittstellenänderungen schlecht/böse sind und habe nun diese richtiggestellt, würde aber gerne wissen wie das funktioniert. Im Voraus vielen Dank.
Grüße Turmoil
Hallo Turmoil,
ja das passiert weil die optionalen Parameter(werte), wenn du sie weglässt, beim aufrufenden Code (zwangsweise) mit einkompiliert werden - so als würdest du die Methode mit allen Parametern aufrufen.
Daher ist was du vorhast nicht möglich.
Auch wenn du zwei Versionen mit gleicher Signatur und sich ändernen Standardwerten hättest, würde die alte (exe) Version immernoch die alten Standardwerte vom damaligen Kompilieren verwenden.
Grüße
spooky
Hallo,
du mußt dich irgendwo vertan (oder ungeschickt ausgedrückt) haben bei
Die alte Exe kompiliert mit der alten Dll, funktioniert
obj.f("tmp");
Die optionalen Parameter werden beim Kompilieren automatisch eingefügt (wenn nicht angegeben), so daß die Anzahl und Typen der Parameter bei der DLL übereinstimmen müssen.
Es kann also niemals deine alte EXE mit der neuen DLL zusammen funktionieren.
Um abwärtskompatibel zu bleiben, müßtest die Methode überladen und mit den neuen Parametern erweitern...
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄