MissingMethodException()



  • Ich habe eine Anwendung geschrieben die andere Anwendungen einbindet. Ich erhalte nun an einer Stelle eine MissingMethodException(). Es wird gesagt Methode ABC() in NamespaceX.KlasseY nicht gefunden. Vermutlich weil bei diesem Kunden eine sehr alte Version ohne die von mir benötigte Funktion installiert ist.

    Ich habe die Zeile die diese Exception wirft in eine Try Catch Klausel gepackt. Trotzdem springt der Interpreter nicht in die Catch Klausel? Ich habe Log Messages drum herum gesetzt. Aber schon die LogMessages vor dem fehlerhaften Aufruf erscheinen nicht. Es erscheinen nur die Log Messages vor dem Aufruf der Funktion wo die Fehlerhafte Zeile drin ist. Erst wenn ich die Funktion in der sich die fehlerhafte Zeile befindet in eine Try Catch Klausel packe, erst dann wird die Exception von meiner Anwendung gefangen. Ist dieses Verhalten bekannt?

    void funcA() {
      try {
        Log("A"); // A steht im Log
        funcB();
      } catch {
        Log("D"); // D steht im Log
        // Erst hier wird die MissingMethodException gefangen.
      }
    }
    
    void funcB() {
      try {
        Log("B"); // Kein B im Logfile!
        NamespaceX.KlasseY.ABC();
      } catch {
        Log("C");// Kein C im Logfile!
      }
    }
    


  • Die Runtime versucht vermutlich nicht erst die Funktion ABC() zu finden wenn sie das erste mal aufgerufen wird, sondern wenn die Funktion die den Aufruf enthält compiliert wird. Die genauen Regeln wann was compiliert wird und wann welche Methodenreferenzen aufgelöst werden müsstest du dir evtl. selbst ergoogeln.

    Was auf jeden Fall immer funktionieren muss: alle Aufrufe von ABC durch Code ersetzen der ABC über Reflection aufruft (bzw. halt den alternativen Code ausführt falls ABC nicht vorhanden ist).



  • Mit Reflection habe ich bisher noch nicht gearbeitet. Ich schaue es mir mal an:
    http://www.codeproject.com/Articles/17269/Reflection-in-C-Tutorial

    Aber ich glaube es ist billiger beim Start die Versionsinfo auszulesen und ggf mit Meldung abzubrechen als die alten Versionen zu unterstützen.

    Vielen Dank für die Rückmeldung 🙂


Log in to reply