Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Schnittstellenänderung in dll mit alter exe wirft Fehler trotz optionalem Parameter
Turmoil
myCSharp.de - Member



Dabei seit:
Beiträge: 60
Herkunft: Karlsruhe

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 244
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.355

beantworten | zitieren | melden

Hallo,

du mußt dich irgendwo vertan (oder ungeschickt ausgedrückt) haben bei
Zitat von Turmoil
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.
private Nachricht | Beiträge des Benutzers
ThomasE.
myCSharp.de - Member



Dabei seit:
Beiträge: 454

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers