Interface cast eines Objekt aus Activator.CreateInstance geht nicht
-
Moin!
Ich erzeuge mit Activator.CreateInstance ein Objekt zur Laufzeit über seinen Namen. Sowohl der Code zur Erzeugung als auch die Klasse sind Teil des selben Projekts/Assembly/Namespace. Also nichts mit externem Assembly/.dll o.ä. Trotzdem funktionierts nicht. Wieso?!
// Funzt Type t = Type.GetType("MeinSpace.MeineKlasse"); Object o = Activator.CreateInstance(t); // Funzt nicht (siehe Exception) IMeinInterface i = (IMeinInterface)o;
Exception:
Das Objekt des Typs MeinSpace.MeineKlasse kann nicht in Typ MeinSpace.IMeinInterface umgewandelt werden.
-
Naja es sieht nach dem aus was die Exception sagt.
Kann es sein das deine Klasse das Interface gar nicht implementiert? Sind Klasse und Interface alspublic
definiert?
-
Klar wird das Interface implementiert
Klasse ist public, das Interface sowieso. Wenn ich das "zu Fuss" mache, d.h das Objekt ohne Activator erzeuge, geht es auch. Es muss wohl irgendwas mit der dynamischen Erstellung zu tun haben.
-
Ist es DASSELBE Interface aus dem selben Assembly oder ist es eine Kopie?
-
Object o = Activator.CreateInstance(typeof(MeinSpace.MeineKlasse));
Hast du das schon mal probiert? Mach auch einen Vergleich: typeof(MeinSpace.MeineKlasse).GUID mit Type.GetType("MeinSpace.MeineKlasse").GUID.
-
Mechanics schrieb:
Ist es DASSELBE Interface aus dem selben Assembly oder ist es eine Kopie?
Ist dasselbe. Es spielt sich alles im selben Assembly ab, ich lade lediglich den String mit dem Klassennamen aus einer externen Datei, sonst ist alles dort wie unter "normalen" Bedingungen.
-
Kannst du ein einfaches Beispiel in einem separaten Projekt erstellen und austesten und falls der Fehler weiterhin auftritt es hier zeigen? Also mit der Klasse und dem Interface und der Erstellung und dem Fehler
Grüssli
-
Servus,
stand auch mal wie der Ochse vorm Berg. Bei mir lag es an 3 Dingen:
1. Activator.CreateInstance läd nicht "alle" Assemblies nach (fällt bei dir weg, du hast nur eine)
2. Die Assembly war bei mir strongly named und im GAC vorhanden
3. Beim Build sollte die Assembly im GAC eigentlich ersetzt werden, wurde sie aber nicht. Das führte dazu, dass ich zwei unterschiedliche Versionen hatte -> GAC + Eigenes ProjektdebugverzeichnisWie rant schon sagte, gucke mal auf die GUID oder den QualifiedName. Liegt in 99% der Fälle an so einem Schmu...
Gruß
Hellsgore
-
Ich hab anhand deines Codes mal probiert, ob es bei mir funktioniert.
Ich habe keine Probleme ein auf deine Weise geladenes Objekt in das Interface zu casten.
Bist du sicher, dass sich alles in einer Assembly abspielt?
-
Hm, strange. Ich hatte das Interface in der Zwischenzeit mal rausgeschmissen, neu eingebaut, alles neu erzeugt und nun gehts auf einmal
(edit)
Der GUID Vergleich war übrigens identisch gestern