Klassen anhand des Names instanzieren

FwDonnerbalken

Erfahrenes Mitglied
Moin zusammen,

folgendes Problem beschäftigt mich:

Ausgangssituation:
Mein Programm dient als Schnittstelle zwischen einem ERP System und einen Webshop. Über eine für meine Zwecke strukturierte XML Datei sollen Daten in das ERP-System geschrieben werden. Zu diesem Zweck stellt das ERP System diverse Objekte bereit, die ich über die entsprechenden Properties mit Werten füllen kann. Da es sich um COM-Objekte handelt arbeite ich an dieser Stelle mit InvokeMember um Zugriff auf die Properties anhand ihres Names zu erhalten.

InvokeMember erfordert jedoch auch die Angabe des Objektes, welche die Properties enthält. Dazu übergebe ich bisher, gesteuert über eine switch-Struktur, immer ein Objekt des jeweils benötigten Typs an InvokeMember.

Diese Vorgehensweise gefällt mir jedoch nicht, da man so die unterschiedlichen Objekte des ERP-System (also Rechnung, Aufrag, Kunde, Artikel etc.) hart kodieren muss. Mein Wunsch ist es zur Laufzeit anhand des Objektnames als String (zB, Invoice oder Order) das Objekt anzulegen und dies einer Variable vom Typ object zuzuweisen. Anschließend übergebe ich diese allgemeine object-Variable an InvokeMember.

Wer kann mir an dieser Stelle beratend zur Seite stehen?!

Vielen Dank!

Sebastian
 
Moin Nico,

deine Idee ist gut, jedoch klappt es nicht. Wie ich feststellen musste, werden von den oben genannten Objekten keine Instanzen von Klassen, sondern von einem Interface erstellt. Und das scheint mit dem Activator.CreateInstance nicht zu klappen.

Wahrscheinlich wurde dieser Weg gewählt, da das Objekt vom Typ System.__ComObject ist.

Gruß,
Sebastian
 
Achso, Das COM hatte ich überlesen, sorry
Nur: von Interfaces lassen sich keine Instanzen erzeugen. Irgendwo muss es eine Klasse geben, die dieses implementiert und damit auch eine Instanz liefern kannn, sei es duch Konstruktor, eine statische Create-Methode oder ähnlichem.
Fall ich heute abend dazu komme, werd ich mal schauen, ob ich eine Möglichkeit finde, COM-Objekte per Reflection zu erzeugen
 
Hi Sebastian

Sorry, ging nicht eher. Hab es jetzt grad probiert und es funktioniert auch mit COM.
Hast du die richtigen Namen angegeben, vor allem für den Klassennamen? Der muss inklusive Namespace angegeben werden.
Beispiel mit ICQ:
C#:
ObjectHandle handle = Activator.CreateInstance("interop.ICQLITESHELLLib", "ICQLITESHELLLib.MCLiteShellExtClass");
 
Hi Niggo,

hat jetzt leider was länger gedauert, bis ich deinen Vorschlag ausprobieren konnte. Leider erhalte ich folgende Exception:

System.SystemException {System.Runtime.InteropServices.COMException
"Die COM-Klassenfactory für die Komponente mit CLSID {4A1DF035-9612-4CCC-B9B8-C58511D0D705} konnte aufgrund des folgenden Fehlers nicht abgerufen werden: 80040111."

Hast du sowas schon mal gesehen und erfolgreich gelöst?!

Gruß,
Sebastian
 
Zurück