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();
            }
    
    ….