Laden...

Forenbeiträge von nairolF Ingesamt 8 Beiträge

08.08.2007 - 09:10 Uhr

Hallo,

ich habe die Aufgabe von einem Client auf mehrere Server zuzugreifen, dort Daten abzuholen und nach der Bearbeitung wieder zurückzustellen.
Bei dem Prozess, welcher die Daten mittels Events bereitstellt, handelt es sich um eine C++ Applikation, welche die Daten als Com Objekte übergibt.
Als geeignete Lösung erschien mir hier einen Host über den C++ Server zu legen, welcher die Events fängt und dann mittels Remoting an den oder die Clients verteilt.
Mein Problem hierbei ist, dass ich mittels Remoting scheinbar keine Com Objekte übermitteln kann.
Die Daten jeweils in .Net Objekte gleicher Struktur zu kopieren und dann zu übertragen fände ich ein wenig aufwendig.
Gibt es hierfür eventuell eine elegantere Lösung?

Gruss, Florian

16.11.2006 - 18:45 Uhr

Hat sich erledigt - erstmal...
Wenn ich nach 10 solchen Speicheraktionen den Collect vom Garbagecollector aufrufe, dann vergisst .Net auch nicht, mit welchen Objekten es zu tun hat.

Danke erst mal.

Gruss, Florian

16.11.2006 - 11:33 Uhr

Ich habe ein Com Objekt, welches wiederum verschiedene Com Objekte hält. Dieses Objekt ist eingebettet in ein .Net Objekt.
Die Eigenschaften des Com Objektes haben bis auf 2 einen festen Typ. Die 2 sind als Object deklariert.
Eins dieser beiden Objekte hat eine Schnittstelle implementiert.
Ich sollte vielleicht noch dazu sagen, dass ich auf die Gestaltung dieses Com Objektes keinen Einfluss habe.

Nun lese ich mittels Reflection eine Instanz dieser Klasse aus. Dies geschieht in einem anderen Assembly. Dabei werden alle Eigenschaften der Objekte ausgelesen, daraus eine SQL Anweisung gebaut und dann wird das Objekt mittels verschiedener SQL Anweisungen in der Datenbank persistiert. Da es sich dabei um viele Anweisung handeln kann und diese nur geschlossen Gültigkeit haben, geschieht dies innerhalb einer Transaktion.
Im Prinzip funktioniert es ... aber nun zum Problem:

Lasse ich den Code 1000x laufen -
also erzeugen einer Instanz mit all den entsprechenden Unterinstanzen und gebe es dann an den Persistiermechanismus, dann klappt es in 98,5% der Fälle. Es klappt meist 40x und dann mal nicht - aber so richtig steckt da kein Muster dahinter. Hat auch schon 500x in Folge geklappt.
Bei den anderen 1,5% erkennt er eines der oben angegebenen COM Objekte, welche in der Schnittstelle lediglich als Object deklariert sind, nur als __ComObject, wenn ich nach dessen Typ mittels object.GetType().Name frage.
Im Debugprozess sind keine der Eigenschaften dieses Objektes zu erkennen.
Amüsanterweise kann aber mittels

if (obj is IEineBestimmteSchnittstelle)

bei einem der beiden Objekte trotzdem es lediglich als __ComObject erkannt wird, die Schnittstelle ermittelt werden, das Objekt in die entsprechende Schnittstelle gecastet werden und daraufhin die Methoden dieses "__ComObject"s aufgerufen werden.

Gibt es vielleicht irgendeinen Trick, wie ich gewährleisten kann, dass Com Objekte immer richtig von der Reflection behandelt werden?

Gruss Florian

30.10.2006 - 21:38 Uhr

Original von herbivore
Hallo nairolF,

mal ein Schuss ins Blaue:
>

herbivore

Das wars. Danke.
Mit "protected" hat es funktioniert.

Florian

28.10.2006 - 22:54 Uhr

Es tut mir echt leid... jetzt funktioniert es hier mit einem anderen Projekt.
Ich habe das jetzt hier zu Hause mit genau den Codeschnipseln gemacht, die ich auch in dem Projekt auf der Arbeit hatte.
Hab also wieder verschiedene Projekte erstellt - eines, welches eine Instanz einer abgeleiteten Klasse erzeugt, und eines welches eine Klasse mit dem Auslesemechanismus besitzt.
Hier hat es funktioniert. Auf der Arbeit nicht.
Einzigster Unterschied ist, dass in der Basisklasse auf der Arbeit verschiedene COM Objekte gekapselt sind.
Ich werde mir das am Montag noch mal ansehen.

Gruss, Florian

28.10.2006 - 15:27 Uhr

Original von Traumzauberbaum
Ich denke du solltest bei GetProperties die Überladung benutzen, bei der BindingFlags als Parameter genommen werden. Über die kannst du dann ganz exakt einstellen was die Funktion zurückgeben soll.

Das tue ich bereits, nur es hilft nicht.

28.10.2006 - 15:26 Uhr

ich bin mir zwar nicht sicher ob dir das was bringt, aber bitteschön.
Damit lese ich testweise die Properties aus.
Ist der Code in einem fremden Assembly, werden bei einer vererbten Klasse nicht die Eigenschaften des Objektes ausgelesen, von welchem es geerbt hat.
Ist der Code in einem Assembly, welches eine Referenz hat auf die Assembly in welchem die Klasse steht, werden auch die Eigenschaften des Basisobjektes ausgelesen.

        private static void iterateForeignObj(object Fremdobj, ArrayList arr)
        {

            Type t = Fremdobj.GetType().BaseType;
            PropertyInfo[] pis = Fremdobj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

            foreach (PropertyInfo p in pis)
            {
                if ((p.PropertyType.IsInterface || p.PropertyType.IsClass)
                    && !p.PropertyType.Equals(typeof(string)))
                {
                    try
                    {
                        object o = p.GetValue(Fremdobj, null);
                        if (o != null)
                        {
                            arr.Add(o);
                            iterateForeignObj(o, arr);
                        }

                    }
                    catch (Exception)
                    {
                        
                    }
                }
            }
        }
28.10.2006 - 14:03 Uhr

Hallo,

ich habe eine Klasse erstellt, welche mittels Reflektion ein andereres Objekt ausliest um dann die Daten in einer Datenbank zu speichern. Das funktioniert einwandfrei.

Die Klasse ist in einem seperaten Assembly und "kennt" die übergebene Klasse nicht.
Analysiere ich nun Klasse A, so funktioniert das wie ich es möchte.
Leite ich nun Klasse B von Klasse A ab, übergebe dann eine Instanz von B an diese Reflektionklasse, so kann ich mit getProperties() lediglich die Eigenschaften von B auslesen, bekomme aber nicht die vererbten Eigenschaften von A.

Versuche ich nun mit demselben Code innerhalb des Assemblies in welchem A und B definiert sind die Eigenschaften von B auszulesen, erhalte ich auch die Eigenschaften von A.

Eine Möglichkeit wäre sicherlich, meine Reflektion Klasse in das Assembly in welchem A und B definiert sind zu kopieren. Das widerspräche aber meinem Ansatz zur Erstellung wiederverwertbarer Komponenten.

Hat jemand von euch vielleicht eine Idee, wie ich dieses Problem lösen könnte?

Gruss, Florian