Klasse von VB6 nach VB.NET portieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von markus.obi.

    Klasse von VB6 nach VB.NET portieren

    Hallo Community,

    ich habe folgendes Problem ich habe Jahrelange VB6 im Industrieumfeld genutzt. Nun bin ich aber an einem Punkt angekommen wo ich auf VB.Net umsteigen muss.
    Mein in VB6 geschriebene Klasse übergibt über ein Event Werte an das aufrufende Hauptprogramm. Leider musste ich festellen das das leider in NET nicht mehr gewünscht ist.

    Hier nun meine Frage wie muss die Deklaration der Klasse im Hauptprogramm vornehmen damit ich diese Daten auch verarbeiten kann.
    Kurz zum Hintergrund die Klasse liest zyklisch Informationen aus einer Maschinensteuerung aus und soll diese dann an mein Hauptprogramm übergeben.

    Hier mal meine Code Beispiele.

    CODE der Klasse


    Quellcode

    1. ' >> Ereignis Schnittstellen DB erfolgreich ausgelesen
    2. Public Event PollDB(ByVal Lesepuffer() As Byte, ByVal Puffer_laenge As Long)


    <---- Deklaration des Events in der Klasse

    Quellcode

    1. RaiseEvent PollDB(l_DBpuffer, l_PDatLen)


    <---- Auslösen des Events in der Klasse


    CODE des Programms

    Quellcode

    1. Public WithEvents sps_server As SPS_SERVER_PRODAVE_V62.SPS_SERVER_PRODAVE_IE


    <---- Deklaration der Klasse im Hauptprogramm

    Quellcode

    1. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    2. sps_server = New SPS_SERVER_PRODAVE_V62.SPS_SERVER_PRODAVE_IE
    3. sps_server.PollTimerIntervall = 2000
    4. End Sub


    <---- Object erstellen bei Programmstart

    Quellcode

    1. Private Sub sps_server_PollDB(ByVal Lesepuffer() As Byte, ByVal Puffer_laenge As Long) Handles sps_server.PollDB
    2. Label1.Text = CStr(Lesepuffer(0))
    3. End Sub


    <---- Bei Lebel1.text bekomme ich den Exeption. Weiß warum der kommt aber nicht wie ich Ihn weg bekomme.


    Über eure Hilfe würde ich mich sehr freuen Vielen Dank im Vorraus.

    Inkodatec schrieb:

    Leider musste ich festellen das das leider in NET nicht mehr gewünscht ist.


    Von wem ist das nicht gewünscht? Von deinem Vorgesetzten/Auftraggeber oder "von Microsoft"?
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Inkodatec schrieb:

    Mein in VB6 geschriebene Klasse übergibt über ein Event Werte an das aufrufende Hauptprogramm. Leider musste ich festellen das das leider in NET nicht mehr gewünscht ist.
    naja - wenn deine Klasse in vb6 geschrieben ist, dann kann sie schlecht in einem vb.net Programm Werte übergeben.

    eine in .Net geschriebene Klasse hätte hingegen keinerlei Probleme via Event Werte zu verschicken.

    Inkodatec schrieb:

    Bei Lebel1.text bekomme ich den Exeption. Weiß warum der kommt aber nicht wie ich Ihn weg bekomme.
    Warum kommt der denn?
    Wie lautet ühaupt die Fehlermeldung?
    Folgender Fehler kommt.


    InvalidOperationException
    Cross-thread operation not valid: Control 'Label1' accessed from a thread other than the thread it was created on.

    Ich Versuche gerade die Klasse in NET umzusetzen. Und hänge jetzt an diesem Problem der Werteübergabe.

    Inkodatec schrieb:

    Problem der Werteübergabe.
    Trenne GUI und Daten.
    Empfinde die GUI nach, erstell im Designer die Methoden und fülle sie dann aus.
    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!
    Was ist, wenn ich dir sage, dass dein toller VB6 Code schon damals falsch (ich vermeide mal das Wort Scheiße) war und nur aufgrund von Glück funktioniert hat. Hast wohl gar nicht gemerkt, dass du in VB6 einfach so einen threadübergreifenden Zugriff auf ein GUI-Control gemach hast und die Runtime hats wohl auch nicht gestört...
    yoda.arachsys.com/csharp/threads/winforms.shtml
    You may get away with it in some cases, but only by blind luck.


    Ist immer amüsant zu sehen wenn beim Umstieg auf ne neue Srpache die ganzen alten Fehler zu Tage gefördert werden. Natürlich ist dann immer die neue Sprache Schuld, weil "früher ging das!"
    Nur weil ein Code compiliert und/oder scheinbar funktioniert, heißt es noch lange nicht, dass der Code korrekt ist.

    markus.obi schrieb:

    dass du in VB6 einfach so einen threadübergreifenden Zugriff auf ein GUI-Control gemach hast


    Es könnte hilfreich sein, zu erklären wo hier der Thread-übergreifende Zugriff genau passiert bzw. wie er zustande kommt. Auf den ersten Blick scheint das Kontrukt mir jedenfalls in Ordnung zu sein, denn dafür verwendet er schließlich Events und greift nicht direkt aus dem Objekt heraus auf den Label-Text zu.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Anhand des geposteten Codes kann ich nicht sehen wo da überhaupt ein Thread erstellt wird. Der TE schreibt nicht wo der Befehl RaiseEvent ausgeführt wird. (scheinbar in einem anderen Thread)

    @ErfinderDesRades:
    Nö um erlich zu sein ich weiß es auch nicht, aber offensichtlich ist es so. Es sei denn, der TE hat irgendwo beim porten threading eingebaut (ohne es zu verstehen) und es uns dann verschwiegen.
    Mal kurz nach "checkforillegalcrossthreadcalls vb6" gegooglet. Ergebnis:
    But I just want to get the extremely simple code of "Me.Visible = True" to work. I consided starting this project again in VB6 where I know simple code works without any of this cross thread crap.

    link

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „markus.obi“ ()