Hilfestellung bei Fehlersuche - System.MissingMethodException: Methode nicht gefunden: "Void ...

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Hilfestellung bei Fehlersuche - System.MissingMethodException: Methode nicht gefunden: "Void ...

    Moin!

    ich habe ein Problem und weiß nicht genau was die Fehlermeldung bedeutet dann ist es natürlich auch scher einen Fehler zu finden ....

    Es geht darum das ich eine Funktion habe

    VB.NET-Quellcode

    1. Public Sub Show(ByVal Message As String, ByVal TryCatchMessage As String)
    2. 'Optional ByVal CallBy As String = ""
    3. Show_Work(Message, TryCatchMessage, k_CompanyName)
    4. End Sub


    die in einer DLL liegt mit allgemeinen Funktionen.

    Diese hatte ich zunächst um einen zusätzlichen optionalen Parameter ergänzt (oben schon wieder rausgenommen).

    Da dieser Parameter optional ist sollten alle bestehenden Aufrufe kein Problem haben, da ja ein Vorgabewert hinterlegt ist.

    Nun bekam ich aber folgende Fehlermeldung.

    Die Anwendung unterstützt kein JIT-Debuggen.
    Weitere Informationen finden Sie am Ende dieser Meldung.

    ************** Ausnahmetext **************
    System.MissingMethodException: Methode nicht gefunden: "Void EBL.Service.TryCatchReport.Show(System.String, System.String)".
    bei EBL.Optionen.Options.GetFS2Use_Work(String FsName, String DefaultFsName, Boolean EvenGetBasis)
    bei EBL.Optionen.Options.GetFS2Use_Kanal() in X:\VB_NET_2015\Projects\tappenbeckja\EBL.Optionen\EBL.Optionen\cls_Options.vb:Zeile 203.
    bei EBL_FDOExport.OpenTBMask_Cmd.Short_FDO() in X:\VB_NET_2015\Projects\tappenbeckja\EBL_FDOExport\EBL_FDOExport\cls_FDO_Export_cmd.vb:Zeile 24.
    bei Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
    bei Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
    bei Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()


    Eine andere Funktion die auch TryCatchReport.Show zugreift die funktioniert - nur an meiner aktuellen Baustelle funktioniert gar nichts mehr.

    Ich hatte die Fehlermeldung so verstanden, dass die Anzahl der Parameter nicht passt. Aber das kann auch nicht ganz sein, da die richtige Anzahl von Übergabeparametern in dem Editor korrekt ist.

    Es muss also aus meiner Sicht eine andere Bedeutung haben.

    Kann mir einer von Euch weiterhelfen?

    Gruß Jan
    @jan99 Das ist ein wenig sehr wenig Code.
    Sieh Dir mal folgende Code-Stellen an:

    Quellcode

    1. X:\VB_NET_2015\Projects\tappenbeckja\EBL.Optionen\EBL.Optionen\cls_Options.vb => Zeile 203.
    2. X:\VB_NET_2015\Projects\tappenbeckja\EBL_FDOExport\EBL_FDOExport\cls_FDO_Export_cmd.vb =>Zeile 24.
    Da wird was aufgerufen.
    Wie ist die DLL eingebunden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Moin!

    ich weiß, dass hier und da immer noch unsicher bin. In diesem Falle bin ich mir sicher - es sind Verweise und bis zu dieser Anpassung hat das auch alles funktionert!

    Habe den zurückgesetzten Code und auch den einer alten Version mit Notepad++ compare verglichen - kein Unterschied!!

    War es das, was Du wissen wolltest?

    Gruß Jan

    jan99 schrieb:

    War es das, was Du wissen wolltest?
    Nein.
    Diese Info hätte in den Startpost gehört.
    Was ist bei

    jan99 schrieb:

    dieser Anpassung

    alles hinzugekommen?
    Was war die Motivation dieser Änderung?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe nochmal etwas hin und her kompelliert und sonst etwas gemacht - was soll ich sagen. Jetzt funktioniert es wieder!

    Welche Kröte da verschluckt wurden kann ich nicht sagen.

    Danke für die Unterstützung.

    Gruß Jan



    Moin!

    aus

    VB.NET-Quellcode

    1. Public Sub Show(ByVal Message As String, ByVal TryCatchMessage As String)
    2. 'Optional ByVal CallBy As String = ""
    3. Show_Work(Message, TryCatchMessage, k_CompanyName)
    4. End Sub


    wurde

    VB.NET-Quellcode

    1. Public Sub Show(ByVal Message As String, ByVal TryCatchMessage As String, Optional ByVal CallBy As String = "")
    2. 'Optional ByVal CallBy As String = ""
    3. Show_Work(Message, TryCatchMessage, k_CompanyName)
    4. End Sub


    Ziel soll es sein am Ende eine Info an die Funktion zu geben wer diese aufgerufen hat damit ich bei Fehler den Aufrufenden einfacher identifizieren kann.

    CallBy wird dann an Show_Work durchgereicht. Auch wenn es auf den ersten Blick in Show keine Sinn macht ... aus meiner Anfangszeit habe ich das eine oder andere in den Funktionen etwas kompliziert gemacht. Muss ich nochmal bereinigen. Aber erst einmal muss es grundsätzlich wieder funktionieren.

    Wie gesagt Show ist in einer DLL die von anderen Funktionen erfolgreich aufgerufen wird.

    Gruß Jan




    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jan99“ ()

    jan99 schrieb:

    damit ich bei Fehler den Aufrufenden einfacher identifizieren kann.
    Sieh Dir mal StackTrace an.
    Erstell Dir einen und Du bekommst die Aufruf-Information, die Du einfach auswerten kannst. Gugst Du auch hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Optionale Parameter:
    Das sind nur zusätzliche Informationen darüber, welchen Wert der Compiler für einen Parameter einfügen soll, wenn man beim Aufruf keinen angibt.

    VB.NET-Quellcode

    1. Sub DoIt(A As Integer, Optional B As Integer = 2)
    2. End Sub
    kompiliert nicht zu

    VB.NET-Quellcode

    1. Sub DoIt(A As Integer, B As Integer)
    2. End Sub
    3. Sub DoIt(A As Integer)
    4. Foo(A, 2)
    5. End Sub
    sondern es wird nur eine einzige Methode erstellt, die zwei Parameter hat.

    Wenn man diese Methode dann aufruft, dann wird sowohl DoIt(1), als auch DoIt(1, 2) zum exakt gleichen Aufruf kompiliert, nämlich für den fehlenden Parameter wird der Standardwert eingefügt.

    Verweise auf DLLs:
    Wenn Du in Deinem Projekt (nennen wir es Foo.exe) auf eine DLL (Bar.dll) verweist und eine Methode davon aufrufst (Sub DoIt(A As Integer)), dann steht in Foo.exe drin, dass die CLR bitte in Bar.dll die DoIt-Methode suchen soll, die genau einen Parameter vom Typ Integer entgegen nimmt.
    Du kompilierst, fürhrst aus, läuft super.

    Wenn Du jetzt aber in der Bar.dll die DoIt-Methode abänderst, dass da steht Sub DoIt(A As Integer, Optional B As Integer = 2), dann gibt es, wie wir oben gelernt haben, die ursprüngliche Methode mit einem Parameter nicht mehr. Der Trick ist jetzt, dass Du nur die Bar.dll neu kompiliert hast, die Foo.exe aber immer noch meint, es gäbe eine Methode mit nur einem Parameter. Wenn Du dann die alte Foo.exe und die neue Bar.dll in einen Ordner wirfst und das ausführst, wird sich die CLR beschweren, dass es in Bar.dll keine DoIt-Methode gibt, die exakt einen Parameter entgegen nimmt.

    Die Lösung ist also: Wenn Du die Bar.dll änderst und neu kompilierst, dann musst Du auch die Foo.exe neu kompilieren. Denn auch wenn Du am Quellcode nichts änderst, muss der Compiler trotzdem einen anderen Aufruf erzeugen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils