Embedded Mono: Verweisen auf C # -Objekte in C ++

8

Ich arbeite daran, mono in eine Anwendung einzubetten, die ich erstelle, und ich bin nicht weit gekommen, aber eines der Dinge, die ich nicht zu finden scheint, ist, wie man mono erkennt, wenn ich ein benutze Objekt und mit einem Objekt erledigt.

Ich möchte einen Verweis auf ein C # -Objekt beibehalten, um Methoden aufzurufen, bis die Lebensdauer ihres parallelen Objekts in C ++ abgelaufen ist. An diesem Punkt möchte ich mono mitteilen, dass das C # -Objekt sicher gesammelt werden kann.

Wie wird das erreicht?

    
Jeff 04.12.2011, 03:03
quelle

3 Antworten

3

Es scheint, dass das, wonach ich suche, mono_gchandle_new ist , und halte den Griff, nicht das MonoObject *, und verwende mono_chandle_get_target, wenn ich es brauche.

mono_gchandle_new erlaubt es Ihnen, beim Erstellen des Handle zu pinnen, aber ist es möglich, hinterher zu fixieren?

    
Jeff 04.12.2011, 04:14
quelle
0

Verwenden Sie System::GCHandle::Alloc und rufen Sie ToIntPtr für das Ergebnis auf, um ein Token zu erhalten und das Objekt vor der Erfassung zu schützen. Rufen Sie ToPointer() auf und speichern Sie sie als void* .

Verwenden Sie System::GCHandle::FromIntPtr , wenn Sie das Token dem Objekt zuordnen oder es freigeben müssen, damit es erneut für die Sammlung ausgewählt werden kann.

    
Ben Voigt 23.05.2014 18:54
quelle
0

Eine Sache, die bei der Verwendung von mono_chandle_new () zu beachten ist. Sie behält nur das C # -Objekt, auf das Sie im Speicher verwiesen haben, aber wenn dieses Objekt andere Objekte zuweist, unterliegen diese immer noch den Garbage-Collection-Routinen. Die Tatsache, dass ein Objekt, für das Sie einen Griff haben, seine Unterobjekte auf sich haben lassen kann, hat mir ziemlich viel Ärger bereitet.

Ich durchsuche derzeit das mono GC-System, um zu sehen, ob ich es beheben kann, damit es diese Objekte als Root-Objekte behandelt.

Wenn Sie genug Objekte (& lt; 4096) haben, können Sie mono_gc_register_root () verwenden ... wir können Tausende von Objekten haben, also ist das nicht gut für unsere Zwecke.

UPDATE: Also war ich inkorrekt dabei, wir hatten uns in das Monoobjektzuweisungssystem eingeklinkt und wir haben die "atomare" Variable nicht korrekt auf die GC-Zuordnungsfunktionen übertragen. "Atom" bedeutet etwas anderes als der GC, es hat nichts mit dem gleichzeitigen Zugriff zu tun, es bedeutet tatsächlich, dass dem Speicher Referenzen zugewiesen werden, die andere Objekte (Atom = 0) oder nicht (Atom = 1).

    
Richard Lyle 23.05.2014 18:47
quelle

Tags und Links