19

Ich erhalte einen Fehler von System.MissingMethodException, nachdem ich einen optionalen Parameter in einer Komponente und die andere Komponente, die es aufgerufen wurde nicht erstellt wurde, wie es mit einer alten Anzahl von Parametern aufrufen.System.MissingMethodException nach dem Hinzufügen eines optionalen Parameters

Nur die Komponente, in der der Parameter hinzugefügt wurde, wurde als Patch erstellt. Die aufrufende Komponente ist alt, da es keine Änderung gibt.

Wenn der anrufende Komponente Lauf es Fehler gibt:

Exception Informationen

Ausnahmetyp: System.MissingMethodException Nachricht: Methode nicht gefunden: ‚LabelURLs IPSD.BnB.Transaction.Postage.GetLabelURLs (System.String) '. Daten: System.Collections.ListDictionaryInternal Target: Void GenerateScanForm (Int32, Int32) Help: NULL Quelle: BnBDispenseQueueProcess

Soweit ich weiß, dass es keinen Fehler sollte als neuer Parameter ist optional. Eine weitere Komponente aufrufen (EXE) als Windows-Dienst ausführen.

haben wir eine sehr verkabelte Problemumgehung gefunden, um es auszuführen. Indem Sie die geänderte Komponente einmal entfernen und eine aufrufende Komponente ausführen, die sagt, dass die DLL nicht gefunden wurde. Der Ort die gleiche DLL wieder und aufrufende Komponente funktioniert gut :).

Ich denke, ich vermisse einige Interna von .net.

Lassen Sie mich wissen, wenn mehr Informationen benötigt werden.

+0

Wir fügten optionalen Parameter zu einer unserer allgemeinen Bibliothek hinzu. Das hat alle laufenden Module gebrochen (Wir haben Glück, es war auf dem Testen von env). Das sind phantastische Entwicklungszeit-Features von .net, es sieht so aus, als müssten wir sie erst einmal verstehen, bevor wir sie benutzen. Danke, dass du das fragst. – CreativeManix

+0

@CreativeManix lassen Sie mich bitte Ihr Ergebnis wissen. da konnte man nicht ganz verstehen warum es sich so verhielt. kann ein Kompiliertrick geschehen hinter Szene – sandeep

+0

@Sanddep als Jon Skeet erwähnt, optionale Parameter sind Kompilierzeit Feature. Bei der Kompilierzeit in der Anruferassemblierung werden optionale Parameterwerte mit Standardwerten übergeben. Wenn Sie der allgemeinen Bibliothek einen optionalen Parameter hinzugefügt haben, stellen Sie sicher, dass Sie auch die Aufrufer-Assembly kompilieren. Wenn Sie nicht alle Aufrufer-Assembly kompilieren möchten, verwenden Sie keinen optionalen Parameter, sondern stattdessen eine überladene Methode. – CreativeManix

Antwort

31

Nur die Komponente, in der der Parameter hinzugefügt wurde, wurde als Patch erstellt. Die aufrufende Komponente ist alt, da es keine Änderung gibt.

Es sollte eine Änderung es sein, weil der alte Code eine Methode aufruft, die nicht mehr existiert!

Soweit ich weiß, sollte es keinen Fehler auslösen, da neuer Parameter optional ist.

Das ist keine Ausführungszeit Entscheidung - es ist eine Kompilierung- Entscheidung. Wenn Sie eine Methode wie diese haben:

void Foo(int x, int y = 5) 

und rufen Sie es wie folgt:

Foo(10); 

dann der Compiler wandelt effektiv, dass in einen Aufruf von:

Foo(10, 5); 

Der Anruf hat die volle Argumentliste in der Binärdatei. Wenn Sie von der Single-Parameter-Version in die Multi-Parameter-Version auf eine Weise wechseln möchten, die die Binärkompatibilität nicht beeinträchtigt, müssen Sie stattdessen eine Überladung hinzufügen, z.

void Foo(int x) 
{ 
    Foo(x, 5); 
} 

void Foo(int x, int y) 
{ 
    ... 
} 

Alternativ können Sie die Telefonvorwahl wieder aufzubauen und das auch erneut bereit.

Ich bin zutiefst misstrauisch gegenüber Ihrer Problemumgehung. Bist du dir sicher, dass du, wenn du die DLL wieder an ihren Platz stellst, sie durch die neue Version (mit dem optionalen Parameter) anstelle der alten Version ersetzt hast?

+0

ja ich ersetze nur mit neuer Version. Deine Antwort macht Sinn. Aber wegen der Umgehungslösung sieht es in meinem Fall nicht völlig richtig aus. – sandeep

+0

@sandeep: Ich * stark * vermute, dass etwas an Ihrer Diagnose der Problemumgehung ist, die falsch ist. Wie oft hast du das probiert? Hast du es definitiv mit dem neuen Code gesehen? Haben Sie den Anrufcode definitiv * nicht * ersetzt? Es sollte einfach nicht funktionieren - es gibt nichts in C#, um dies zu tun, es sei denn, Sie verwenden dynamische Typisierung. –

+0

ein Update im Zusammenhang mit dem Austausch von DLL. – sandeep