Registriert: Do Mai 13, 2004 16:36 Beiträge: 116 Wohnort: Deutsch-Wagram (Österreich)
Hi!
Ich kann eine .net-DLL mit Assembly.LoadFrom ohne Probleme laden. Aber Assembly.CreateInstance funktioniert nur mit Object-Rückgabewerten, wie kann man die erzeugten Instanzen verwenden?
_________________ Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)
Einfach auf den entsprechenden Type casten.
Typename(Variable)
Es gibt unter .Net 2.0 auch noch eine generische Methode Activator.CreateInstance<T> die direkt den richtigen Type schon zur Kompilierzeit zurückgibt.
Wenn du da nil zurückbekommst, dann war das der falsche Type.
Versuch mal als Alternative Activate.CreateInstance und überprüf mal den genauen Type mit dem Debugger oder mit der Funktion Object.GetType().ToString().
Registriert: Do Mai 13, 2004 16:36 Beiträge: 116 Wohnort: Deutsch-Wagram (Österreich)
Also, ich habe jetzt die Klassen gleich genannt, und es funktioniert. Gibt es keine Möglichkeit, "ungleichnamige" Klassen zu verwenden? Ich meine das so:
Abstrakte Klasse:
Code:
type TAbstractPlugin = class
public
procedure InitPlugin; virtual; abstract;
end;
Klasse in der Assembly:
Code:
type TPlugin = class(TAbstractPlugin)
public
procedure InitPlugin; override;
end;
Die Klasse TAbstractPlugin wäre in einer statisch geladenen (unter Projekt->Referenzen) Assembly, und das Programm, dass die dynamische Assembly lädt, benutzt den Typ von TAbstractPlugin. Ist das möglich?
[EDIT]Mir ist gerade ein seltsames Phänomen aufgefallen: Wenn ich die Assembly ändere, ohne das Programm neu zu kompilieren, werden Funktionen der alten Assembly aufgerufen (sowohl wenn ich System.Reflection.Assembly alsauch wenn ich System.Runtime.Remoting.Activator verwende). Aber wenn ich die DLL lösche, beendet sich das Programm mit einer Exception. Woran liegt das?[/EDIT]
[EDIT2]Ein weiteres Problem: Ich habe das DLL-Projekt als .net-Package neu erstellt, weil ich auf der Borlandseite gelesen habe, dass die Libary-Assemblies mit anderen .net-Sprachen Probleme bereiten. Der Code der Klasse ist gleich geblieben, aber der gleiche Name hilft nicht mehr. Wenn ich die Typen in einen String konvertiere und ausgebe, sind sie gleich.[/EDIT2]
_________________ Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)
Versuch mal mit System.Activator. Vielleicht ist der leicht anders.
Unter .Net sind Typen nur dann gleich, wenn sie aus der gleichen Assembly (mit gleicher Version) kommen.
Lass dir mal die vollständigen Namen der Typen vor dem Typecast ausgeben.
Also typeof(TAbstractClass).AssemblyQualifiedName und von dem neu erstellten Objekt auch den gleichen Namen.
Zusätzlich kann man mit typeof(TAbstractClass).IsAssignableFrom(obj.GetType()) prüfen, ob das neue Objekt wirklich kompatibel ist.
Registriert: Do Mai 13, 2004 16:36 Beiträge: 116 Wohnort: Deutsch-Wagram (Österreich)
Es ist schon grotesk: Wenn ich beim 1. Versuch .net-Packages anstatt .net-Libraries verwendet hätte, hätte es sofort funktioniert. Aber so habe ich die falschen Dinge beachtet. Ich habe die Klasse in der Assembly jetzt von der abstrakten Klasse abgeleitet (die abstrakte Klasse ist jetzt in einer anderen, statisch geladenen Assembly).
_________________ Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)
Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.