Laden...

Schnittstellenänderung in dll mit alter exe wirft Fehler trotz optionalem Parameter

Erstellt von Turmoil vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.099 Views
T
Turmoil Themenstarter:in
60 Beiträge seit 2008
vor 5 Jahren
Schnittstellenänderung in dll mit alter exe wirft Fehler trotz optionalem Parameter

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

S
248 Beiträge seit 2008
vor 5 Jahren

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

4.931 Beiträge seit 2008
vor 5 Jahren

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.

T
461 Beiträge seit 2013
vor 5 Jahren

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... 😄