Delegate speichern
-
Hallo Forum,
ich möchte eine C++/Cli Klassenbibliothek in einem C# Programm verwenden. Hierfür soll zunächst ein Delegate als Callback von C#(GUI) nach C++/Cli(Klassenbibliothek) in Form eines IntPtr übertragen werden. Dieser IntPtr soll in der Klassenbibliothek dann wieder in einen Delegaten ge-marshal-d werden und dann in der Klasse für spätere Aktivitäten zur Verfügung stehen. In dem c#-GUI wird natürlich alles in der Form-Klasse gespeichert (Delegate+ IntPtr).
Leider funktioniert das Ganze aber nicht, da der Delegate nach Beendigung des Funktionsrumpfes „GetCallback“ verschwindet.
Was kann man tun?delegate void SetTextDelegate(String^Text); public ref class Main { SetTextDelegate^SetText; public: void Test() { SetText("Hallo"); //NullreferenceException, obwohl //GetCallback schon ausgeführt wurde } public: void GetCallback(IntPtr pointer) { SetText = static_cast<SetTextDelegate^> (System::Runtime::InteropServices::Marshal::GetDelegateForFunctionPointer(pointer,_Interface::SetTextDelegate::typeid )); SetText("Test"); }
-
Hallo Forum,
wie es aussieht, habe ich auf der C#-GUI Seite einen Fehler gemacht. In Wirklichkeit funktioniert alles. Zum Beispiel könnte es auf der C# GUI- Seite folgendermaßen aussehen:public delegate void Del(string message, int command); public partial class Form1 : Form { public void SetText(string message) { richTextBox1.Text = richTextBox1.Text + message + "\n"; } MainClass currentMainClass; //eingebundene Klassenbibliothek Del Delegate_SetText; IntPtr DelegatePointer; //Form Initialize Components public Form1() { InitializeComponent(); //Send Callbacks Delegate_SetText = SetText; currentMainClass = new MainClass(); DelegatePointer = Marshal.GetFunctionPointerForDelegate(Delegate_SetText); currentMainClass.GetCallback( DelegatePointer); } private void button1_Click(object sender, EventArgs e) { currentMainClass.Test(); } ….