C# Code in VB.Net umwandeln

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von SeriTools.

    C# Code in VB.Net umwandeln

    Hallo zusammen!

    Ich habe mehrere Zeilen Code in C# gefunden, die ich für ein Programm brauche. Das es in VB geschrieben ist, muss ich diesen Code erstmal
    umwandeln.

    Hier der Originalcode in C# :

    Quellcode

    1. public static void mAction(Action<Form1> action)
    2. {
    3. var pform = Form.ActiveForm as Form1;
    4. if (pform != null)
    5. pform.doAction(action);
    6. }
    7. public void doAction(Action<Main> action)
    8. {
    9. if (InvokeRequired)
    10. Invoke(action, this);
    11. else
    12. action(this);
    13. }


    Aufgerufen wird der Code folgendermaßen:

    Quellcode

    1. Form1.mAction(pForm =>
    2. {
    3. pForm.Handler(SocketId.dataBuffer, psize);
    4. });


    In dieser Funktion Rufe ich die Methode Handler (In der Klasse Form1 mit den Parametern SocketId.dataBuffer und pSize) auf.
    Das wird über die anderen Methoden (mAction und doAction), in der nach einem benötigten Invoke geprüft wird, geregelt.

    Die ersten beiden Funktionen habe ich folgendermaßen in VB übersetzt:

    VB.NET-Quellcode

    1. Public Sub mAction(ByVal action As Action(Of Form1))
    2. Dim pform = TryCast(Form.ActiveForm, Form1)
    3. If pform IsNot Nothing Then
    4. pform.doAction(action)
    5. End If
    6. End Sub
    7. Public Sub doAction(ByVal action As Action(Of Form1))
    8. If InvokeRequired Then
    9. Invoke(action, Me)
    10. Else
    11. action(Me)
    12. End If
    13. End Sub


    Doch bei der 3. Methode habe ich keinen Plan wie man so etwas in VB schreiben könnte.
    Jemand eine Ahnung oder ist sowas garnicht in VB realisierbar ?!

    MfG

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „darksplain“ ()

    man muss immer Fehler beheben und es ist dabei natürlich möglich auch jeden einzelnen davon zu beheben ;)
    am besten du Postest uns diese Fehler, gegen die wir auch was machen können...

    da du bei solchen Projekten sehr oft die selben Fehler bekommst, kann man die auch sehr schnell beheben...wie sehr oft mit DirectCast von z.B. Short zu Integer gefällt VB glaube ich nicht ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    VB.NET-Quellcode

    1. Form1.mAction(Function(pForm) Do 'bei dem do kommt der Fehler "Ausdruck erwartet" Sollte eig. klar sein, dass das nicht funktioniert, da nach do immer ein Loop steht
    2. pForm.Handler(SocketId.dataBuffer, psize)
    3. End Function) 'und hier bei dem end function kommt ein Fehler, dass da End Sub stehen soll. Das ist aber unsinn! Aus irgendeinem Grund zählt VB das End Function nicht zu dem "(Function(pForm)" dazu!


    MfG

    //Edit: Ich habe das hier auf einer Microsoft Website zu edm Thema VB 2010 gefunden:

    Ich denke mal, dass sowas mit dem Code gemeint ist, was der Online-Converter ausgespuckt hat. Ich werde mir mal VB 2010 herunterladen, vllt ist die Art mit der Syntax von VB 2008 noch nicht kompatibel!
    Interessant, wieder was neues dazu gelernt :D

    So;

    Wenn ich es alles in eine Zeile packe:

    VB.NET-Quellcode

    1. Form1.mAction(Function(pForm) Do Form1.Handler(SocketId.dataBuffer, psize) End Function)

    Kommen die Fehler:
    - "Audruck erwartet" bei dem "Do"
    - "Zu viele Argumente für Public Sub mAction(action as System.Action(Of Form1))" unter dem size
    - "end of - Anweisung erwartet" unter dem End Function

    Wenn ich das Do weglasse:

    VB.NET-Quellcode

    1. Form1.mAction(Function(pForm) Form1.Handler(SocketId.dataBuffer, psize) End Function)


    Kommen die Fehler:
    - "Der Ausruck ergibt keinen Wert" bei Form1.Handler(SocketId.dataBuffer, psize) (das sollte eig klar sein dass man das so nicht machen kann)
    - "Komma, ")" oder eine gültige Ausdrucksfortsetzung erwartet." bei dem "End" von "End Function"
    Ich glaube nicht, dass das mi Lambda-Funktionen geht.

    Hab mir mal bei MSDN (msdn.microsoft.com/de-de/library/018hxwa8.aspx ) dieses Action(of T) angeschaut.

    Versuche es mal so:

    1. Erstelle eine neue Sub:

    VB.NET-Quellcode

    1. Private Sub Sub1(ByVal pform as Form1)
    2. pform.Handler(SocketId.dataBuffer, psize)
    3. End Sub


    2. Deklariere ein Action(Of Form1) und weise ihm die Adresse von Sub1 zu:

    VB.NET-Quellcode

    1. Dim ActionForm1 as Action(Of Form1) = AddressOf Sub1


    3. Ändere den Aufruf von mAction so:

    VB.NET-Quellcode

    1. Form1.mAction(ActionForm1)


    4. Jetzt sollte es funktionieren. :D

    lg SeriTools
    | Keine Fragen per PN oder Skype.
    Vielen Dank funktioniert enwandfrei!
    Ich habe es jetzt so gelöst, dass ich am Anfang der Klasse neue Variablen für den dataBuffer und die psize erstellt habe, da ich bei der Action ja leider keine
    weiteren Argumente übergeben kann!

    VB.NET-Quellcode

    1. Public Shared tbuffer As Byte()
    2. Public Shared tpsize As Int32

    Die nuee Sub:

    VB.NET-Quellcode

    1. Private Shared Sub Sub1(ByVal pform As Form1)
    2. pform.Handler(tbuffer, tpsize)
    3. End Sub

    Leider muss ich in meiner anderen Methode immer der Variableneinen neuen Wert zuweisen:

    VB.NET-Quellcode

    1. Dim SocketId As SocketPacket = CType(asyn.AsyncState, SocketPacket)
    2. tbuffer = SocketId.dataBuffer
    3. Dim psize As Integer = SockId.winSock2.EndReceive(asyn)
    4. tpsize = psize
    5. Form1.mAction(ActionForm1)


    Ich würde es lieber ohne Public-Variablen machen und zwar direkt so:

    VB.NET-Quellcode

    1. Dim SocketId As SocketPacket = CType(asyn.AsyncState, SocketPacket)
    2. Dim psize As Integer = SockId.winSock2.EndReceive(asyn)
    3. Form1.mAction(ActionForm1(SocketID.dataBuffer, psize)


    Gibt es da einen Umweg dass so zu realisieren ?!

    MfG
    Ja, das geht, allerdings nciht mit Action(of T), da Action nur einen Parameter aufnehmen kann. Dafür gibt es aber Delegaten:
    msdn.microsoft.com/de-de/library/y22acf51(v=VS.100).aspx
    Dort findest du auch ein Beispiel zur Benutzung von Delegaten.

    EDIT: Wenn du einfach nur die Zeilen sparen willst, gibt es auch einen anderen Weg:

    VB.NET-Quellcode

    1. tbuffer = CType(asyn.AsyncState, SocketPacket).dataBuffer
    2. tpsize = SockId.winSock2.EndReceive(asyn)
    3. Form1.mAction(ActionForm1)


    lg SeriTools
    | Keine Fragen per PN oder Skype.