Laden...

reflection System.MissingMethodException

Erstellt von leuchtfeuer vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.100 Views
L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren
reflection System.MissingMethodException

Hi, baue gerade einen ClassSaver der eine Klasse samt Unterklassen mit allen private Membern speichert und die dann wieder auslesen kann. Dadurch kann man 100% von dem alten zustand der Klasse vor dem Beenden des Programmes wiederherstellen. Das Funktioniert auch schon wenn die Klasse einen Konstruktor ohne Parameter hat. Ich lese die Parameter aus und gebe ihnen den default Wert und will dann eine Instanz machen. Dann bekomme ich jedoch die Exeption dass, er den Konstruktor nicht findet. Das liegt vermutlich daran da er die Klasse nicht kennt da sie in der .dll nicht enthalten ist, denn in der Hauptklasse von der aus das ausgeführt wird funktioniert es. Deswegen habe ich mir die Assemby ins programm geladen so konnte ich den Typ nachbauen, aber er findet den Konstruktor nicht.

Der wichtige Code dazu:

Assembly assembly = null;
try{
	assembly = Assembly.Load(this.AssemblyFullName);
}catch(Exception)
{
	try{
		assembly = Assembly.LoadFrom(this.AssemblyName + ".exe");
	}catch(Exception){}
}

Type type = null;
if(assembly != null)
{
	type = assembly.GetType(this.Namespace + "." + this.Type);
}

ParameterInfo[] parameter = System.Type.GetType(type.AssemblyQualifiedName).GetConstructors()[0].GetParameters();
List<object> defaultValues = new List<object>();
foreach (ParameterInfo param in parameter)
{
	defaultValues.Add(param.DefaultValue);
}

if(type != null)
{
	this.value = Activator.CreateInstance(type, defaultValues);
}
else
{
	throw(new Exception("Typ nicht gefunden"));
}

Hoffe mir kann hier jemand helfen.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo leuchtfeuer,

nicht direkt in Bezug auf die Exception. Aber vielleicht bei dem übergeordneten Problem. Warum brauchst du überhaupt etwas selbst gestricktes? Kannst du nicht (binäre oder XML-)Serialisierung verwenden. Wenn dir die Standard-Serialisierung alleine nicht reicht, wäre vielleicht Benutzerdefinierte Serialisierung was für dich.

herbivore

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Weil, dann keine private Sachen gespeichert werden und es bis auf das mit dem Konstruktor schon funktioniert.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo leuchtfeuer,

binäre Serialisierung speichert nur private Felder.

herbivore

849 Beiträge seit 2006
vor 11 Jahren

Hallo leuchtfeuer,

also ersteinmal würde ich eine Zeile umschreiben die mir ein wenig suspekt vorkommt:


System.Type.GetType(type.AssemblyQualifiedName).GetConstructors()[0].GetParameters();

nach


type.GetConstructors()[0].GetParameters();

dann würde ich da mal reindebuggen und schauen was für defaultValues du gesammelt hast, und ob typen und reihenfolge der Methodensignatur deines Konstruktors entsprechen.

ups.. nochwas: Activator.Create Instance erwartet ein object[] als parameter. Ich vermute das der Compiler aus deiner Anweisung ein CreateInstance(type, defaultValues.ToString()) macht und du somit die falsche Überladung von Create Instance aufrufst.

L
leuchtfeuer Themenstarter:in
21 Beiträge seit 2012
vor 11 Jahren

Danke, das funktioniert . 😁