Announcement

Collapse
No announcement yet.

Steuerelemente aus Datei nachladen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Steuerelemente aus Datei nachladen

    Also ich habe ein Programm mit einem Startmodul und einem Fenster.
    Ich würde das gern so machen, das ein Benutzer des Programms sich eine Datei von meinem Server runterladen kann. In dieser Datei sollen Ergänzende Steuerelemente und Funktionen gespeichert sein, die der Form dann hinzugefügt werden, aber immer erst zur Laufzeit. Damit kann der Benutzer den Funktionsumfang bestimmen und ich kann jederzeit neue Add-Ons entwickeln, ohne das ganze Programm Updaten zu müssen. Die Möglichkeit gleich alle Funktionen in die exe zu packen scheitert aus Speicherplatzgründen und daran, dass das ganze dann zu unübersichtlich wird.

    Das Problem:
    Wie kann man die Steuerelemente mitsamt Funktionen in einer Datei abspeichern und zur Laufzeit laden?
    Kann man da dll's nutzen?

    Nachtrag: Die Steuerelemente sollen alle gemeinsam in einer Tab-Page gespeichert sein,
    die dann zur Laufzeit an eine TabControl drangehängt wird
    Zuletzt editiert von [NEMO]; 23.04.2010, 17:25. Reason: Nachtrag

  • #2
    Also ich gehe mal davon aus dass alle Deine Steuerelemente die importiert werden sollen ein bestimmtes Interface implementieren.
    Dann lädst Du die Datei runter und suchst per Reflection nach Klassen in deiner Assembly die dieses Interface implementieren. Danach kannst Du per Activator Instanzen dieser Klasse anlegen.

    Comment


    • #3
      Erstmal Danke für die Antwort

      Also grob habe ich verstanden was du meinst.
      Im prinzip nur eine Klassenbibliothek zur Laufzeit laden und darin nach entsprechenden Klassen (Steuerelemente) suchen. Und eine Instanz mit CreateInstance(TypeName As String) erstellen.

      So weit die Theorie: wie kann man das Programmieren?
      Rausgefunden habe ich:
      - Datei downloaden
      - Assembly laden
      - Instanz aktivieren
      mir fehlt:
      - per Reflection nach klassen suchen

      kannst du mir da nochmal helfen?

      Danke

      Comment


      • #4
        Sieht ungefähr so aus:

        [highlight=c#]
        var assembly = Assembly.Load(@"d:\temp\myAssembly.dll");

        foreach(var type in assembly.GetTypes())
        {
        if (type.GetInterfaces().Contains(typeof(IMyInterface )))
        Activator.CreateInstance(type);
        }
        [/highlight]

        Habs jetzt so nicht getestet, allerdings sollte das funktionieren. IMyInterface sollte natürlich in einer separaten Assembly sein, damit die Trennung sauber ist.

        Comment


        • #5
          Meine Übersetzung:

          [highlight=c#]
          Dim las = Assembly.Load("d:\temp\myAssembly.dll")
          For Each T In las.GetTypes
          If T.GetInterfaces().Contains(TypeOf TabPage1) Then
          Activator.CreateInstance(T)
          End If
          Next
          [/highlight]

          Bei "...TabPage1) Then..." gibt es eine Fehlermeldung die mir nicht ganz logisch erscheint:
          ""Is" erwartet" . Aber dabei liefert contain doch einen Boolean, oder? Irgendwas Stimmt da nicht.

          Comment


          • #6
            Ich weiss auch net was da nicht stimmt, allerdings siehts eigentlich ganz gut aus und in C# hats so auch funktioniert und ließ sich auch übersetzen.

            Du musst natürlich mit der Instanz aufsm Activator noch was machen, aber das ist ja klar hoffentlich
            Zuletzt editiert von fanderlf; 26.04.2010, 22:16.

            Comment


            • #7
              Wäre es eh nicht sinnvollerer nur ein UserControl in der myAssembly.dll zu verpacken, dieses dynamisch zu laden und dann auf einem von einem TabControl erzeugten TabPage anzuzeigen? Eine spezielle TabPage Ableitung in der Assembly zu haben erscheint mir merkwürdig. Kann man das so einfach instanziieren und in ein TabControl hängen?

              Comment


              • #8
                Naja man muss halt die TagPage als UserControl anlegen. Ansonsten gehts wahrscheinlich nicht, weil die TabPage ja auch nur ein Element der Form ist und keine eigenständige Klasse. Das könnte vielleicht der Fehler sein. Allerdings dürfte das nur beim Laden Probleme machen und nicht zur Kompilierzeit wie er schreibt.

                Comment

                Working...
                X