Laden...

CreateInstance() liefert null zurück

Erstellt von Michael Schuler vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.576 Views
M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren
CreateInstance() liefert null zurück

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

24 Beiträge seit 2005
vor 18 Jahren

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)*

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

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.

24 Beiträge seit 2005
vor 18 Jahren

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)*

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

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);
		}
	}
}
24 Beiträge seit 2005
vor 18 Jahren

Die Klasse ist nicht von MarshalByRefObject abgeleitet...

(ja|nein|vielleicht)*

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

*peinlich*

Sorry, das war der Fehler 🙁

Danke für die Geduld 🙂

Das ist mir jetzt wirklich peinlich...

24 Beiträge seit 2005
vor 18 Jahren

Kein Problem, geht mir oft genug auch nicht anders 😮)

(ja|nein|vielleicht)*