Announcement

Collapse
No announcement yet.

Reflection Frage

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

  • Reflection Frage

    Hallo!<br>
    Ich möchte folgendes realisieren:<br>
    Ein Hauptprogramm sollte in der Lage sein zur Laufzeit verschiedene Assemblies zu laden und Funktionen daraus aufzurufen.<br>
    Das Ganze soll so funktionieren, dass die zur Verfügung stehenden Funktionen (also die Funktionsnamen in dem Fall) in eine ListBox (oder sowas in die Richtung) geladen werden. Allerdings nur die Methoden, die der Programmierer der Assembly dem Hauptprogramm sichtbar machen möchte. Nun weiß ich nicht, wie ich das am Besten realisieren soll: die Funktionsnamen nach irgendeinem Schema aufbauen und das Hauptprogramm nur diese anzeigen lassen, oder Funktionen mittels Attributen zu markieren,..<br> Hat jemand Tipps?<br>
    Ein weiterer Punkt wäre, dass in der Assembly zu jeder Funktion irgendwie eine kurze Beschreibung (Funktionsweise, Erklärung der Parameter,..) gespeichert - und im Hauptprogramm ausgelesen - werden soll.<br>
    Hoffe, irgendwer kann Tipps geben.

  • #2
    Hallo,

    die Attribute sind schon der richtige Weg, um die zusätzlich benötigten Informationen abzulegen. Über <b>Assembly.LoadFrom</b> wird die Assembly geladen, um dann über <b>GetTypes</b> die dort untergebrachten Types auszulesen.

    Über die Methode <b>IsDefined</b> kann man prüfen, ob eine Klasse ein bestimmtes Attribut enthält:
    <pre>
    Type aType = typeof(OssiSoft);
    if (aType.IsDefined(typeof(OSPrototypAttribute), false))
    {
    MessageBox.Show("Die Klasse hat das gesuchte Attribut.");
    }
    </pre>
    Das Aulesen aller Methoden mit ihren Attribute ist dann auch kein Problem mehr:
    <pre>
    System.Text.StringBuilder aSB = new System.Text.StringBuilder();
    Type aType = typeof(OssiSoft);
    System.Reflection.MemberInfo[] aMIArray = aType.GetMembers();
    foreach(System.Reflection.MemberInfo aMI in aMIArray)
    {
    aSB.AppendFormat("{0} :", aMI.Name, Environment.NewLine);
    foreach (Attribute aAttr in aMI.GetCustomAttributes(false))
    {
    aSB.AppendFormat("{0}; ", aAttr.GetType().Name);
    }
    aSB.AppendFormat("{0}", Environment.NewLine);
    }
    MessageBox.Show(aSB.ToString());
    </pre&gt

    Comment


    • #3
      Dankesehr..<br>
      Ein Problem habe ich allerdings:<br>
      Ich habe ein Attribut namens NWMain erstellt und auf eine Klasse angewandt. Wenn ich nun sämtliche Attribute dieser Klasse auflisten lasse, erhalte ich die Ausgabe "NWMain".<br>
      Soweit ist also alles ok. Wenn ich allerdings mittels <b>t.IsDefined(typeof(NWMain), false)</b> abprüfe, ob das Attribut vorhanden ist, erhalte ich false als Rückgabe. Vorschläge

      Comment


      • #4
        kann mir da wirklich niemand weiterhelfen

        Comment


        • #5
          Hallo,

          die als Anhang beigefügte ZIP-Datei enthält das Beispiel

          Comment


          • #6
            Dankesehr nochmals.

            Comment


            • #7
              Hmm.. Immer noch das selbe Problem.<br>
              Ich habe das Attribut in der einzubindenden Assembly erstellt und möchte sozusagen im Hostprogramm darauf abprüfen. Ich habe das jetzt so gelöst, dass ich das Attribut in Assembly UND Hostprogramm definiert habe. (Ansonsten könnte ich IsDefined ja nicht mit dem Attribut als Parameter aufrufen).<br>
              Allerdings ist das vielleicht der Grund dafür, dass ich false als Rückgabe erhalte.<br>
              Hat damit jemand Erfahrung

              Comment


              • #8
                Hallo,

                der richtige Weg besteht darin, dass eigene (neue) Attribut in einer separaten Class Library zu definieren, deren Assembly dann von allen beteiligten Modulen als Verweis eingebunden wird

                Comment

                Working...
                X