Panel aus DLL auslesen, aber wie?

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

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von felipe12305.

    Panel aus DLL auslesen, aber wie?

    Guten Abend,
    ich habe eine kleine Frage: Wie kann ich aus einem Ordner(der die DLLs enthält(alle mit .NET etc.)) aus jeder DLL das Panel TabPanel laden? (Und an all die die meinen "Google es!": Ich stehe nun seit 2 Tagen rumprobieren auf dem Schlauch! :))
    Wenn ich debugge kommt keine Fehlermeldung(die ich ausgebe wie "Error: Can't load assembly!") ausser eine Exception dass pl Nothing ist

    Quellcode

    1. Eine Ausnahme (erste Chance) des Typs "System.NullReferenceException" ist in Sidebar.exe aufgetreten.

    Das ist bisher mein Code:

    VB.NET-Quellcode

    1. Sub LoadApps()
    2. Dim apps As String()
    3. Dim inp As String = IO.File.ReadAllText("C:\Sidebar\Configuration\apps.dat")
    4. apps = inp.Split(";")
    5. For Each a As String In apps
    6. list_of_apps.Add(a, Assembly.LoadFrom(a))
    7. If a = "" Then
    8. Exit For
    9. End If
    10. Dim tabpage_ As New TabPage(a.Replace("C:\Sidebar\Apps\", ""))
    11. tabpage_.BackColor = Me.BackColor
    12. tabpage_.ForeColor = Me.ForeColor
    13. tabpage_.Font = New Font("Segoe WP Light", 11)
    14. Dim as_ As Assembly = Nothing
    15. If list_of_apps.TryGetValue(a, as_) = False Then
    16. MessageBox.Show("Error: Can't load assembly! (" + a + ")", "Error")
    17. Exit For
    18. End If
    19. Dim o As Object = as_.GetType((a.Replace("C:\Sidebar\Apps\", "").Replace(".dll", "")) + ".Controller.SidebarPanel")
    20. Dim pl As Panel = o
    21. pl.Dock = DockStyle.Fill
    22. tabpage_.Controls.Add(pl)
    23. tabs_apps.TabPages.Add(tabpage_)
    24. Next
    25. End Sub

    Ein paar weitere Informationen:

    Quellcode

    1. - tabs_apps ist ein TabView
    2. - in der Datei activated.dat sind Einträge in Folgendem Format:
    3. "C:\Sidebar\Apps\Clock.dll;C:\Sidebar\Apps\MP3_player.dll;"
    4. etc.
    5. - in der Datei Clock.dll ist aber eine Klasse mit dem Namen "Controller"(Dateiname:"Controller.vb") mit der Property SidebarPanel die vom Typ Panel ist. (Ich programmiere diese "Apps" momentan manuell d.h. im Code)



    Wo liegt der Fehler?
    LG & danke von felipe12305
    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!
    @RodFromGermany Hi, ich bin nach mikeb69's Tutorial vorgegangen, nun habe ich im PluginConnector einen Fehler: Er findet die Klasse Main nicht(wird nicht als Typ angezeigt)
    Hier die Ausgabe der erkannten Typen aus SClockApp:

    Quellcode

    1. SClockApp.My.MyApplication
    2. SClockApp.My.MyComputerSClockApp.My.MyProject
    3. SClockApp.My.MyProject+MyWebServices
    4. SClockApp.My.MyProject+ThreadSafeObjectProvider`1
    5. SClockApp.MainSClockApp.My.Resources.Resources
    6. SClockApp.My.MySettings
    7. SClockApp.My.MySettingsProperty

    Die Main Klasse wäre dann aber doch SClockApp.Main oder??
    Hier die Main-Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class Main
    3. Implements SidebarInterface.SidebarInterface
    4. Private WithEvents p As Panel
    5. Private WithEvents lbl As Label
    6. Function Tick() As Integer Implements SidebarInterface.SidebarInterface.Tick
    7. Dim tn As String = "hh.mm.ss"
    8. tn = tn.Replace("hh", Date.Now.Hour).Replace("mm", Date.Now.Minute).Replace("ss", Date.Now.Second)
    9. lbl.Text = tn
    10. Return 0
    11. End Function
    12. Function GetPluginName() As String Implements SidebarInterface.SidebarInterface.GetPluginName
    13. Return "Clock"
    14. End Function
    15. Function GetPluginTooltip() As String Implements SidebarInterface.SidebarInterface.GetPluginTooltip
    16. Return "A simple digital clock"
    17. End Function
    18. Function GetMainPanel() As Panel Implements SidebarInterface.SidebarInterface.GetMainPanel
    19. Return p
    20. End Function
    21. Sub Init() Implements SidebarInterface.SidebarInterface.Init
    22. p = New Panel()
    23. p.Name = "ClockPanel"
    24. p.Dock = DockStyle.Fill
    25. lbl = New Label()
    26. lbl.Name = "lbl_clock"
    27. lbl.Text = ""
    28. lbl.Dock = DockStyle.Fill
    29. p.Controls.Add(lbl)
    30. End Sub
    31. End Class



    Und hier nochmal mein PluginConnector (mit dem Dump Abschnitt):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class PluginConnector
    2. Public Shared Function LoadPlugIn(ByVal strFile As String) As SidebarInterface.SidebarInterface
    3. Try
    4. Dim vPlugIn As SidebarInterface.SidebarInterface
    5. Dim a As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile(strFile)
    6. Dim types() As Type = a.GetTypes
    7. ' dump:
    8. Dim t_ As New List(Of String)
    9. For Each t As Type In types
    10. t_.Add(t.FullName)
    11. Next
    12. Dim ta As String() = t_.ToArray()
    13. Dim ty As String = ""
    14. For Each tx As String In ta
    15. ty += tx
    16. Next
    17. IO.File.WriteAllText("C:\dump.dat", ty)
    18. Exit Function
    19. ' dump end
    20. For Each pType As Type In types
    21. Try
    22. vPlugIn = CType(a.CreateInstance(pType.FullName), SidebarInterface.SidebarInterface)
    23. Return vPlugIn
    24. Catch ex As Exception
    25. MessageBox.Show(ex.Message)
    26. Exit For
    27. End Try
    28. Next
    29. Catch
    30. Return Nothing
    31. End Try
    32. End Function
    33. End Class



    Was mache ich hier falsch? :(

    LG

    felipe12305 schrieb:

    Er findet die Klasse Main nicht
    Gib der Klasse Main bitte mal einen anderen Namen, die Zeichenfolge "Main" hat in der Progframmierung allgemein eine besondere Bedeutung.
    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!

    felipe12305 schrieb:

    "No valid plugin found"
    Dann hast Du offensichtlich kein richtiges Plugin.
    Lade Dir zunächst ein Testprojekt und probier die Plugin-Funktionalität aus, ohne gleich ein GUI-Steuerelement zu implementieren.
    Wenn das läuft und Du es verstanden hast, mach den nächsten Schritt.
    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!

    hal2000 schrieb:

    veraltet
    Dieses ja, das andere ist ja schon benannt worden, hab nur keinen Link gefunden.
    Zum Verstehen der Funktionalität halte ich es allerdings für besser.
    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!
    Hallo, Ich habe nun gerade ein Beispielprojekt erstellt mit dem gleichen Tut': Es hat funktioniert!! Ich habe den gleichen PluginConnector verwendet. Das Inteface enthält die Funktion Addieren(z1 As Integer, z2 As Integer) das Plugin addiert die Zahlen(logisch :rolleyes:) und im Host wird (als Bsp. z1/z2=1) als Ergebnis "2" ausgegeben..
    Nun: warum funktioniert das nicht mit dem anderen Pluginsystem?