Probleme mit dynamisch geladener Dll und Instanziierung



  • Hallo,

    ich wollte einen kleinen Plugin-Mechanismus implementieren, aber habe Probleme, die Dlls, die ich geladen habe, vernünftig zu benutzen.

    Also: Ich habe das Assembly "SimulationPlugins.dll" geladen mit

    Assembly loadedAssembly = Assembly.LoadFrom("plugins\\SimulationPlugins.dll");
    

    geladen. Das klappt auch, in der AppDomain tauch das Assembly auf mit folgendem qualifizieren Namen:

    AssemblyQualifiedName = "SimulationPlugins.Surfaces.SphericalSurface, SimulationPlugins, Version=1.0.2072.17928, Culture=neutral, PublicKeyToken=null"
    

    Ich kann weiterhin mit loadedAssembly.GetTypes() durch die enthaltenen Klassen und co iterieren, kann sie sogar mit Activator.CreateInstance instanziieren.

    ABER folgendes klappt nicht:

    1. Wenn ich jetzt eine Klasse aus dem geladenen Assembly habe (z.B. "SimulationPlugins.Surfaces.SphericalSurface") bekomme ich mit
    Type type = Type.GetType("SimulationPlugins.Surfaces.SphericalSurface");
    

    nur null zurück, obwohl das Assembly ja geladen wurde.

    1. Im Assembly ist ein Enum ("SimulationPlugins.Surfaces.ConvexReflectiveSide"), dass ich in einem PropertyGrid anzeigen will. Dort wird nur ein schwarzer Balken angezeigt, und wenn ich die Zeile im Grid auswähle, stürzt das Programm ab, weil der TypeConverter irgendwie nicht richtig existiert oder wie auch immer. Die Exception sagt, dass der Key nicht null sein darf, also in irgendeiner Hashtable. Siehe hierzu folgende beiden Bilder:

    PropertyGrid und Exception StackTrace

    Problem (1) habe ich mit einer Krücke gelöst, die allerdings doof ist: Ich durchsuche alle Types in allen Assemblies in der AppDomain und vergleiche den FullName. Wenn ich ihn finde, merke ich ihn mir in einer Hashtable und gebe ihn zurück. Somit kann ich Type.GetType(..) umgehen. Ist aber ein furchtbare Hack, finde ich...

    Kann mir da irgendjemand weiterhelfen?? Das wäre super!


Anmelden zum Antworten