Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 15:44

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Assemblies dynamisch laden
BeitragVerfasst: Mi Mai 11, 2005 15:49 
Offline
DGL Member

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 11, 2005 17:50 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 11, 2005 18:52 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Also, wenn ich das versuche, bekomme ich immer nil zurück.

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 11, 2005 19:23 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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().


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 12, 2005 16:33 
Offline
DGL Member

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:
  1. type TAbstractPlugin = class
  2. public
  3.   procedure InitPlugin; virtual; abstract;
  4. end;

Klasse in der Assembly:
Code:
  1. type TPlugin = class(TAbstractPlugin)
  2. public
  3.   procedure InitPlugin; override;
  4. 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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 13, 2005 17:58 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 13, 2005 18:51 
Offline
DGL Member

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)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.019s | 18 Queries | GZIP : On ]