Warum kann ich auf eine Sub nicht zugreifen ?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von jan99.

    Warum kann ich auf eine Sub nicht zugreifen ?

    Moin !

    ich habe folgenden Code in eine Klasse für eine Anwendung unter AutoCAD geschrieben:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports Microsoft.VisualBasic
    4. Imports Autodesk.AutoCAD.Runtime
    5. Imports Autodesk.AutoCAD.DatabaseServices
    6. Imports Autodesk.AutoCAD.ApplicationServices
    7. Public Class SaveAs
    8. '------ http://ma22-wiki-001/eblwiki/index.php?title=SaveAs_(Klasse_von_EBL.Acad) ------
    9. <CommandMethod("EBL_SaveAs_SK")>
    10. Public Shared Sub SetProjektInfo2Properties()
    11. SaveAs_Work("C:\temp\", "Sielkataster", "meine Hilfe")
    12. End Sub
    13. Public Sub SaveAs_Work(ByVal SaveAsPath As String, ByVal SaveAsThema As String, ByVal Help As String)
    14. Dim NamensAbschnitt As String = ""
    15. Dim DatumPrefix As String = DateTime.Now.ToString("yyyy-MM-dd") & "_"
    16. Dim Editor As Autodesk.AutoCAD.EditorInput.Editor
    17. Dim TryReport As New EBL.Service.TryCatchReport
    18. ...
    19. End Sub


    Frage: Warum wird der Funktionsaufruf von SaveAs_Work mit folgender Meldung angemerkt?



    ... und was wäre die Lösung?

    Gruß Jan
    Weil SaveAs_Work nicht Shared ist, SetProjektInfo2Properties schon. D.h. SetProjektInfo2Properties ist klasseninstanzunabhängig, kann also aufgerufen werden, egal wie die Instanz aussieht. Nicht so bei SaveAs_Work.
    Das wär wie bei Autos. Es gibt ne Sub Verschrottung, die bei allen Autos, egal, was es für welche sind, immer gleich angewendet wird: Schrottpresse auf, Auto rein, Schrottpresse zu. Das kann man bei ner Sub "Motorenwechsel" nicht machen. Die wäre abhängig davon, was man da für ein Auto bearbeiten will. Klar soweit?

    Anders: muss SetProjektInfo2Properties unbedingt Shared sein? Oder SaveAs_Work nicht? Wenn keine Klassenmembervariablen/-Properties in einer Klassenfunktion verwendet werden, könnte man die jeweilige Funktion Shared machen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vorweg: Ist dir der Unterschied zwischen einer Public Shared Sub und einer Public Sub bekannt?

    Falls Nein: Eine Sub, die mit Shared markiert ist, kann man aufrufen, ohne vorher ein Objekt der Klasse, in welcher diese Sub deklariert ist, zu erstellen. Wenn eine Sub (kann auch eine Function sein) ohne das Schlüsselwort Shared deklariert ist, dann kann diese nur aufgerufen werden, wenn vorher eine Instanz der Klasse erstellt wurde.

    Um dein Dilemma zu lösen hab ich 2 Ansätze für dich:
    1.) Mach das Shared weg, instanziiere die Klasse SaveAs und rufe SetProjectInfo2Properties() auf oder
    2.) Mach auch deine SaveAs_Work() zu einer Shared Sub.

    Lg Radinator

    Edit: Verdammt! Zu spät ;D

    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Moin!

    danke Euch beiden.

    Die Unterschiede sind nicht bekannt - irgendwo gefunden und dann modifiziert Copy&Paste ... .-)

    Also habe ich es mit Shared Sub versucht und dann sieht das Ganze so aus:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.IO
    3. Imports Microsoft.VisualBasic
    4. Imports Autodesk.AutoCAD.Runtime
    5. Imports Autodesk.AutoCAD.DatabaseServices
    6. Imports Autodesk.AutoCAD.ApplicationServices
    7. Public Class SaveAs
    8. '------ http://ma22-wiki-001/eblwiki/index.php?title=SaveAs_(Klasse_von_EBL.Acad) ------
    9. <CommandMethod("EBL_SaveAs_SK")>
    10. Public Shared Sub EBL_SaveAs_SK()
    11. SaveAs_Work("C:\temp\", "Sielkataster", " meine Hilfe")
    12. End Sub
    13. Shared Sub SaveAs_Work(ByVal SaveAsPath As String, ByVal SaveAsThema As String, ByVal Help As String)
    14. Dim NamensAbschnitt As String = ""
    15. Dim DatumPrefix As String = DateTime.Now.ToString("yyyy-MM-dd") & "_"
    16. Dim Editor As Autodesk.AutoCAD.EditorInput.Editor
    17. Dim TryReport As New EBL.Service.TryCatchReport
    18. ...
    19. End Sub


    Nur wird mir das mit folgender Fehlermeldung vor einem Absturz quitiert!

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

    ************** Ausnahmetext **************
    System.IO.FileNotFoundException: Die Datei oder Assembly "EBL.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden.
    Dateiname: 'EBL.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'
    bei EBL.Acad.SaveAs.SaveAs_Work(String SaveAsPath, String SaveAsThema, String Help)
    bei EBL.Acad.SaveAs.EBL_SaveAs_SK() in X:\VB_NET_2015\Projects\tappenbeckja\EBL.Acad\EBL.Acad\EBL_SaveAs.vb:Zeile 14.
    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()

    === Zustandsinformationen vor Bindung ===
    LOG: DisplayName = EBL.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    (Fully-specified)
    ...


    Habe ich da noch etwas falsch verstanden ?

    Zeile 14 ist der Aufruf von SaveAs_Work.

    Gruß Jan
    Das ist wohl ein Fehler, der nicht im dargestellten Code auftritt. Und laut Fehlermeldung versuchst Du da was zu erstellen, mit dem das Programm nix anfangen kann, weil ihm ein Verweis fehlt. Das ist dann ein anderes Thema. Wäre wohl auch ohne die Sharedgeschichte aufgetreten. Aber probier's testweise mal so, dass Du die Shared-Keywords wegnimmst. Ok, dann musst Du zwar ein Objekt Deiner SavAs-Klasse erstellen, aber das ist ja nur ne Kleinigkeit - hoffentlich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hast du die AutoCAD Dll im selben Ordner liegen, wie die fertige Executable?

    VaporiZed schrieb:

    Ok, dann musst Du zwar ein Objekt Deiner SavAs-Klasse erstellen
    oder einfach

    VB.NET-Quellcode

    1. New SaveAs().EBL_SaveAs_SK()



    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    jan99 schrieb:

    System.IO.FileNotFoundException
    Da fehlt eine Datei.
    Setz einen HAltepunkt drauf und stell vor Ort fest, was da fehlt.
    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!