Hallo Community
Ich habe die folgende Methode:
private IList GetScriptsFromAssembly(Assembly asm) {
ArrayList al = new ArrayList();
foreach(Type type in asm.GetTypes()) {
// auf diese Art ist obj = null
MarshalByRefObject obj = asm.CreateInstance(type.FullName) as MarshalByRefObject;
// auf diese Art ist obj ebenfalls = null
obj = asm.CreateInstance(type.FullName, false, BindingFlags.Public |
BindingFlags.Instance | BindingFlags.CreateInstance, null,
new object[] {}, null, null) as MarshalByRefObject;
if(obj is IScript)
al.Add(obj);
}
return al;
}
Das Assembly, welches übergeben wird, ist nicht null. Es enthält ein Type namens "Skript". Und obwohl der Type "Skript" in der foreach-Schleife gefunden wird, liefert CreateInstance() null zurück. Warum? In der Doku steht, null wird zurückgeliefert, wenn der Type nicht gefunden wird. Doch wenn dies der Fall wäre, käme er ja nicht in die Schleife...
Hoffe ihr könnt mir helfen...
LG Michi
Sind die in der Assembly vorhandenen Klassen auf von MarshalByRefObject abgeleitet? Wenn nein, dann ist dies der Grund, warum es nicht geht.
Nebenbei: ich würde kein Objekt erstellen, wenn es nicht unbedingt notwendig ist, d.h. erst den Typ prüfen, also implementiert die Klasse IScript, und dann erst ein CreateInstance.
(ja|nein|vielleicht)*
Sie sind von MarshalByRefObject abgeleitet. Es funktioniert auch nicht, wenn ich einfach den DatenTyp Object nehme und keinen As-Operator verwende...
Was vieleicht noch interessant wäre ist, dass dies in einer gespiegelten AppDomain stattfindet. Doch nach mir dürfte das keinen Einfluss haben.
Schmeiß mal das zweite CreateInstance raus und das erste auf object stehen lassen und mal prüfen...
Ich habe das ganze bei mir mal mit einer Dummy-Klasse ausprobiert, und es funktioniert.
Wie sieht denn der Konstruktor der Klasse aus?
(ja|nein|vielleicht)*
Die folgende Klasse liegt als .cs Datei in einem Ordner und wird zur Laufzeit Kompiliert. Das kompilieren läuft wunderbar, das Assembly ist ja danach nicht null und gibt den Typ "Skript" zurück...
using System;
using PluginScriptingFramework.Scripting;
namespace FrameWorkTest {
/// <summary>
/// Summary description for Skript.
/// </summary>
public class Skript : IScript {
#region IScript Members
public DateTime Datum {
get { return new DateTime(2006,03,31,18,30,0); }
}
public string Autor {
get { return "Michi"; }
}
public void Run() {
SayHello("Hans");
SayHello("Fritz");
}
public Version Version {
get { return new Version(0, 1); }
}
public string Beschreibung {
get { return "Beschreibung"; }
}
#endregion
private void SayHello(string name) {
Console.WriteLine("Hello {0}", name);
}
}
}
Die Klasse ist nicht von MarshalByRefObject abgeleitet...
(ja|nein|vielleicht)*
*peinlich*
Sorry, das war der Fehler 🙁
Danke für die Geduld 🙂
Das ist mir jetzt wirklich peinlich...
Kein Problem, geht mir oft genug auch nicht anders 😮)
(ja|nein|vielleicht)*