Übersetzung von C# nach VB

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Übersetzung von C# nach VB

    Hallo Community,
    kann mir bitte wer folgen Code von C# nach VB.NET übersetzen?

    C#-Quellcode

    1. protected virtual void OnPausedAsync(EventArgs e)
    2. {
    3. EventHandler eh = PausedAsync;
    4. if (eh != null)
    5. foreach (EventHandler subscriber in eh.GetInvocationList())
    6. subscriber.BeginInvoke(
    7. this, e, new AsyncCallback(
    8. OnAsyncCompleted), subscriber);
    9. }
    Mit diesem Übersetzer kam folgender VB-Code heraus: (oder gibt es bessere Übersetzer, weil der von developerFusion dürfte nicht mehr funzen?)

    VB.NET-Quellcode

    1. Protected Overridable Sub OnPausedAsync(ByVal e As EventArgs)
    2. Dim eh As EventHandler = PausedAsync
    3. If eh IsNot Nothing Then
    4. For Each subscriber As EventHandler In eh.GetInvocationList()
    5. subscriber.BeginInvoke(Me, e, New AsyncCallback(AddressOf OnAsyncCompleted), subscriber)
    6. Next
    7. End If
    8. End Sub
    ...nur wird mir in Zeile #2 PausedAsync angemeckert: "Public Event PausedAsync As EventHandler" ist ein Ereignis und kann nicht direkt aufgerufen werden. Verwenden Sie eine RaiseEvent-Anweisung, um ein Ereignis aufzurufen....ich weis momentan leider keinen Rat ?(
    lg VB1963
    @VB1963 Mach da ne Exe draus und sieh Dir an, wie das der IlSpy übersetzt.
    Das ist sicherer als jeder Snippet-Konverter.
    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!
    Kannst dich ja mal durch meine Signatur testen.

    Convert.Net (stand alone) spuckt volgendes aus:

    VB.NET-Quellcode

    1. Protected Overridable Sub OnPausedAsync(e As EventArgs)
    2. Dim eh As EventHandler = PausedAsync
    3. If eh IsNot Nothing Then
    4. For Each subscriber As EventHandler In eh.GetInvocationList()
    5. subscriber.BeginInvoke(Me, e, New AsyncCallback(OnAsyncCompleted), subscriber)
    6. Next
    7. End If
    8. End Sub

    Oder Action?

    VB.NET-Quellcode

    1. Protected Overridable Sub OnPausedAsync(ByVal e As EventArgs)
    2. Dim eh As Action(Of EventArgs) = AddressOf PausedAsync
    3. For Each subscriber As EventHandler In eh.GetInvocationList()
    4. subscriber.BeginInvoke(Me, e, New AsyncCallback(AddressOf OnAsyncCompleted), subscriber)
    5. Next
    6. End Sub
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    exc-jdbi schrieb:

    Ist PausedAsync eine eigene Funktion?

    NoIde schrieb:

    Oder Action?
    Nein ein Event:

    C#-Quellcode

    1. public event EventHandler PausedAsync;

    VB.NET-Quellcode

    1. Public Event PausedAsync As EventHandler


    RodFromGermany schrieb:

    Mach da ne Exe draus und sieh Dir an, wie das der IlSpy übersetzt.

    VB.NET-Quellcode

    1. Protected Overridable Sub OnPausedAsync(e As EventArgs)
    2. Dim pausedAsync As EventHandler = Me.PausedAsync
    3. If pausedAsync IsNot Nothing Then
    4. Dim invocationList As [Delegate]() = pausedAsync.GetInvocationList()
    5. For i As Integer = 0 To invocationList.Length - 1
    6. Dim eventHandler As EventHandler = CType(invocationList(i), EventHandler)
    7. eventHandler.BeginInvoke(Me, e, New AsyncCallback(Me.OnAsyncCompleted), eventHandler)
    8. Next
    9. End If
    10. End Sub
    da kommt sehr Ähnliches raus (siehe wiederum Zeile #2)
    Danke vorerst einmal - da muss ich weitertüfteln...
    Das geht nicht richtig zu übersetzen, weil c# Events einfach als Delegaten behandelt - vb zickt da rum.
    Aber Probierma

    VB.NET-Quellcode

    1. Protected Overridable Sub OnPausedAsync(ByVal e As EventArgs)
    2. Dim eh As EventHandler = _PausedAsync
    3. If eh IsNot Nothing Then
    4. For Each subscriber As EventHandler In eh.GetInvocationList()
    5. subscriber.BeginInvoke(Me, e, New AsyncCallback(AddressOf OnAsyncCompleted), subscriber)
    6. Next
    7. End If
    8. End Sub
    Mit Glück ist _PausedAsync das (verborgene) Delegat-BackingField des PausedAsync-Events, und ist zugreifbar.

    ErfinderDesRades schrieb:

    oder ist das nicht dein Code?
    Nein, der ist von CodeProject und dieses Project will ich aus Interesse auf VB.NET übersetzen... (Da wird eine ganze Menge mit Events gefuhrwerkt)
    Ich habe es jetzt auch auf deinen Hinweis hin geschafft und dazu noch etwas in StackOverflow gefunden:

    VB.NET-Quellcode

    1. Private _ListPausedAsyncEvent As New List(Of EventHandler)
    2. Public Custom Event PausedAsync As EventHandler
    3. AddHandler(ByVal value As EventHandler)
    4. _ListPausedAsyncEvent.Add(value)
    5. End AddHandler
    6. RemoveHandler(ByVal value As EventHandler)
    7. _ListPausedAsyncEvent.Remove(value)
    8. End RemoveHandler
    9. RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
    10. For Each evt In _ListPausedAsyncEvent
    11. evt.BeginInvoke(sender, e, New AsyncCallback(AddressOf OnAsyncCompleted), evt)
    12. Next
    13. End RaiseEvent
    14. End Event
    15. Protected Overridable Sub OnPausedAsync(ByVal e As EventArgs)
    16. RaiseEvent PausedAsync(Me, e)
    17. End Sub
    ...das Demoproject läuft jetzt auch unter VB.NET
    lg VB1963
    Ich erkenn den genauen Zusammenhang nicht genau, aber Ich finde das irgendwie gefährlich. Oder täusche ich mich jetzt?
    Fehlt da nicht noch ein SyncLock-Block, gerade weile es Asynchron ist, und da mehrere solche Events abgehandlet werden? Oder ist das im ab FW4.5 geregelt?

    Freundliche Grüsse

    exc-jdbi
    Ist vllt. wirklich besser SyncLock zu nutzen, habe erst in den letzen Tagen eine Klasse gemacht, damit ich in einer Klasse invoken kann(zum Events feuern in Threads) ohne das von Control geerbet wird oder eine Control-Instanz in der Klasse ist.(mit dem ISynchronizeInvoke interface). Gab Chaos, hatte teils zu Exceptions geführt(mit multithreats) bis ich SyncLock einsetzte, nun geht das einwandfrei.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „NoIde“ ()

    ich hab ein bischen in den Codeproject-Artikel geguckt, mir schien diese komische Async-Event-Werferei eine Spezialität des Autors zu sein, die er in einem anneren CP-Artikel bereits vorgestellt hatte.
    Meine Wenigkeit würde diesen Part so erstmal nicht übernehmen - das müsste er mir erstmal plausibel machen, warum ich da ein Event im Nebenthread brauchen täte, und dann auch noch in dieser eigenartigen Implementation.