"ref class" in "class" aufrufen?
-
Hallo Leute!
Ich bin neu hier im Forum und auch in der C++ Welt. ich komme eigentlich eher aus der C# Welt. ich hoffe mal, dass meine Frage hier richtig ist.
Es geht um folgendes:
Ich möchte eine C++ DLL in C# verwendet. Leider kann ich die DLL nicht einfach so einbinden. Deshalb will ich eine C++ DLL bauen, die ich in C# verwenden kann und die die Funktionen der anderen DLL kapselt.Meine Ausgangs-DLL enthält eine Klasse ABC. die Methoden dieser Klasse kann ich mittlerweile in C# verwenden, da ich in meiner neuen DLL eine Klasse "public ref class XYZ" angelegt habe und dort die Methoden via "->" Operator aufrufen und in andere Methoden kapseln kann.
Okay, wo liegt jetzt meine Problem? meine Problem ist, dass ich in C# auch Events der DLL benötige. In der Ausgangs-DLL werden Ereignisse mit Hilfe von Funktionsüberschreibung realisiert ("virtual").
In einem Bespielprojekt wird dies wie folgt gelöst:
Dort gibt es eine Klasse "class blubb : public ABC"
in dieser Klasse gibt es dann Methoden wie "void blubb::OnEvent(int a){ ... }"
welche die Ereignisse behandeln.Ich habe in der XYZ Klasse bereits Delegaten und Events angelegt, die ich in C# auch prima verwenden kann. soweit alles okay.
Nur:
wie kann ich in meiner "blubb" Klasse ein Event in meiner "XYZ" Klasse auslösen? meine Idee war, dass ich von "blubb" aus eine Methode in "XYZ" aufrufe, welche dann das entsprechende Ereignis auslöst. doch das klappt nicht. ich komme da immer dann Fehler:"ABC: keine Klasse oder Namespace".Ich mach das ganze nochmal als Code, damit ihr wisst, was ich meine:
[cpp] public class blubb : public ABC { public: void blubb::OnEvent(int a) { ABC::OnEvent(a); } }; public ref class ABC { public: OnEvent(int a) { // Event auslösen } };[/cpp]
So, ich hoffe, ihr wisst was ich meine. was mache ich falsch oder wie kann man es besser machen?
-
Ich glaube du suchst nach gcroot
#include <vcclr.h> gcroot<T>
bzw.
#include <msclr/auto_gcroot.h> auto_gcroot<T>
-
okay, danke. aber leider löst das mein Problem nicht vollständig.
Problem ist, dass gcroot ein neues Objekt dieser Klasse erzeugt. ich muss aber eine Methode im aufrufenden Objekt ansprechen, um dort das Ereignis auslösen zu können, welches ich in C# behandeln möchte.
also ich erzeuge mir in C# ein Objekt der Klasse ABC und rufe anschließend eine Methode dieser Klasse auf. Diese Methode widerum startet eine unmanaged Methode. diese soll ein Event in dem Objekt auslösen, von welchem es aufgerufen wurde...
Also muss meine unmanaged Methode ja irgendwie mein Objekt kennen, aber wie mache ich das?
-
Wie würde es aussehen, wenn Du anstelle von Vererbung eine Aggergation verwendest.
Ev. nur mal zu Testzwecken.Geht das?
-
danke, habs selber gelöst. hab das Event einfach auf "static" gesetzt und jetzt funktioniert es. jetzt muss ich nur dann sehen, dass ich den Speicher wieder sauber bekomme....