UserControls von C# in VB.net übernehmen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    UserControls von C# in VB.net übernehmen

    Hallo..

    Ich möchte meine Anwendung (VB.net) mit einer Hardware kommunizieren lassen. Der Hersteller der Hardware hat ein SDK mit Beispielprojekt in C# mitgeliefert. Leider ist C# für mich noch ein Buch mit mindestens sechs der sprichtwörtlich sieben Siegel. Mit Hilfe eines Codeübersetzers und einigen eigenen Korrekturen habe ich mich bis jetzt ganz gut durchgewurschelt, aber zu einer Sache finde einfach keine Lösung:

    Im C#-Projekt gibt es ein paar UserControls. Die finde ich in einer separaten Kategorie in der Toolbox, auf den Forms und auch im Projektmappenexplorer mit dem Eintrag UserControlX.cs, der zwei untergeordnete Einträge (UserControlX.Designer.cs und UserControlX.resx) enthält.
    In VB.net habe ich bzgl. der UserControls folgendes gemacht:
    Im Projektmappenexplorer Rechtsklick auf das Projekt --> Hinzufügen --> Benutzersteuerelement (es war "Benutzersteuerelement" vorausgewählt, das auch dem Symbol aus dem C#-Projekt entspricht (Quadrat mit Person links unten)
    Ich habe den selben Namen wie im C#-Projekt vergeben, den übersetzten Code eingefügt und die Standard-Controls, die auf dem UserControl waren, mit Strg+A, Strg+C, Strg+V auf das User Control im VB.net-Projekt kopiert.
    in VB.net sehe ich im Projektmappenexplorer das Symbol des UserControls mit dem Namen UserControlX.vb, nicht jedoch die beiden Dateien UserControlX.Designer.vb und UserControlX.resx. Die existieren zusammen mit UserControlX.vb im Projektordner, werden aber in VB.net nicht angezeigt. Vielleicht eine Einstellungssache, ich versuche nur möglichst genau zu beschreiben was los ist :)
    In der Toolbox des VB.net-Projektes habe ich die UserControls nicht. Auch kann ich sie nicht vom C#-Projekt ins VB.net-Projekt kopieren.

    Was mache ich falsch?
    --------
    Lieber inkompetent als inkontinent
    @100Volt Mach Dir mit dem C#-Code eine C#-DLL und füge diese Deinem Projekt hinzu.
    Compiliere, füge dann die Controls der MainForm-Toolbox hinzu und feddich.
    ====
    Generiere Dir den Rumpf einer C#-DLL, füge der die DLLs System.Windows.Forms und ggf. weitere DLLs hinzu, bis sie compiliert.
    Ansonsten pack mal den C#-Code in eine ZIP und hänge sie an.
    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!
    Welche nehme ich? C#-Klassenbibliothek (.NET Framework) oder C#-Klassenbibliothek (.NET Standard)?

    Auf das Thema mit der .dll bin ich bei meinen Recherchen gestern auch immer wieder gestoßen. Was ich nicht verstehe ist, wenn die UserControls immer als .dll vorliegen, weshalb sehe ich im C#-Projekt dann den Quellcode und kann darin editieren? Ich kann doch keine .dll einbinden und in deren Code editieren..?
    --------
    Lieber inkompetent als inkontinent
    @100Volt Die, die zu Deinem Hauptprogramm passt.
    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!
    In dem Referenzprojekt sind die UserControls einfach über den Code drin. Rods Vorschlag kommt daher, dass es einfacher ist, den C#-Code 1:1 in eine eigene C#-Library zu kopieren und diese dann im VB-Projekt einzubinden, als den Code zu übersetzen.
    Ich habe C#-Klassenbibliothek (.NET Framework) genommen.

    Mit dem ersten UserControl ausprobiert. Leider funktioniert das so nicht. Der Code des UserControls spricht an einigen Stellen direkt den Code anderer Klassen des Projektes an, teilweise auch direkt den Code einer Form. Das ist so nicht im Sinne von OOP, denke ich :(

    Was ich grundsätzlich nicht verstehe ist, weshalb gibt es im C#-Projekt die UserControls offenbar nur als Code und nicht als .dll, während ich diese in VB.net als .dll einbinden muß, um sie in der Toolbox verfügbar zu haben. Ist das ein besonderer Vorteil von C#?
    --------
    Lieber inkompetent als inkontinent

    100Volt schrieb:

    während ich diese in VB.net als .dll einbinden muß

    Das DLL-Projekt greift nicht auf andere Klassen Deines Projekts hinzu, da ihm Deine Projekte nicht als Verweis hinzugefügt wurden.
    Wie äußert sich das?
    Du kannst auch das DLL-Projekt als solches Deiner Projektmappe hinzufügen.
    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!
    Problem gelöst, wenn auch anders als gedacht.
    Ich wollte die Nutzung der Schnittstelle in VB.net programmieren. Das Problems war dann, daß ich keine Events bekam. Daraufhin die Idee das C#-Projekt zu übersetzen usw.
    Die Lösung ist, daß die Events erst kommen, wenn ich quasi nachgefragt habe ob welche vorliegen. Wozu dann überhaupt Events? Keine Ahnung. Komische Schnittstelle... Die Doku ist von einem Deutschen in Englisch geschrieben und das sozusagen im Steno-Stil. Der Code im SDK ist auch etwas quirlig und C# ist nicht so mein Ding. Insofern alles nicht so einfach, aber nun gehts voran.

    Do While qProblems.Count=0
    :)
    Loop


    Vielen Dank an alle die versucht haben mir zu helfen!!
    --------
    Lieber inkompetent als inkontinent

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

    100Volt schrieb:

    Die Lösung ist, daß die Events erst kommen, wenn ich quasi nachgefragt habe ob welche vorliegen.
    Wie genau sieht das 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!
    Bei mir im Code sieht das so umgesetzt aus:

    VB.NET-Quellcode

    1. Dim thdXRuntime As New Threading.Thread(AddressOf XRuntime)
    2. Private WithEvents XDevice As New Device
    3. Friend Sub Ini()
    4. thdXRuntime.IsBackground = True
    5. thdXRuntime.Start()
    6. AddHandler XDevice.XEvent, AddressOf XDevice_RaiseXEvent
    7. End Sub
    8. Private Sub XRuntime()
    9. Do
    10. If XRuntime.HandleNextEvent(300) = True Then
    11. While XRuntime.HandleNextEvent(0) = True
    12. Dim s As String = ""
    13. End While
    14. End If
    15. Loop
    16. End Sub
    17. Private Sub XDevice_RaiseXEvent(sender As Object, e As xyz.XEvent)
    18. '....
    19. End Sub


    Man kann beim Nachfragen nach Events eine Wartezeit angeben. Die Antwort ist True, wenn Events auf dem Wartestapel liegen. Da ein Event hier selten alleine passiert, frage ich schneller ab, wenn irgendetwas passiert ist. Es gibt etliche Events, nicht nur das hier Beispielhafte.
    --------
    Lieber inkompetent als inkontinent
    @100Volt Wird das Event auch irgendwo ausgelöst?
    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!
    ja, das Auslösen (Raise) passiert aber in der mitgelieferten .dll.

    Vielleicht ist der Name XDevice_RaiseXEvent im Codebeispiel etwas blöd gewählt. Das ist die Prozedur, die das Event aufruft (s. Handler), nicht der Event-Auslöser, falls das irreführend für Dich war.
    --------
    Lieber inkompetent als inkontinent
    @100Volt Alles in Ordnung, mir fehlte das RaisEvent.
    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!