Как написать код C ++ для обработки события, возникающего в коде C # - PullRequest
2 голосов
/ 16 декабря 2010

Я хотел бы знать, как в коде C ++ я могу получать и обрабатывать события, возникающие из кода C #.

У меня есть модуль C # WinForms UI, который вызывает событие после сбора некоторой информации. Я должен обработать событие в коде C ++, потому что там уже реализован код для обработки собранной информации. Мне просто нужен код, который будет перехватывать событие и извлекать информацию, связанную с ним. Я работаю в VS2010, и код C ++ - это приложение MFC, на случай, если это будет полезной информацией.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 16 декабря 2010

Проверьте взаимодействие с делегатом / указателем на функцию.http://msdn.microsoft.com/en-us/library/367eeye0(v=VS.100).aspx

Вы также можете прикрепить делегат C # к событию и заставить код C # вызывать код C ++ через P / Invoke.

1 голос
/ 16 декабря 2010

Возможно, вы захотите пройти через C ++ / CLI на своем пути из C # в C ++.

Вы могли бы написать оболочку C ++ / CLI, которая в управляемом методе вызывала бы неуправляемый код C ++ напрямую. Обработайте любые преобразования (например, типы данных, System.String в char *) в управляемом методе C ++ / CLI. В C # этот код C ++ / CLI будет отображаться так же, как любая другая внешняя сборка, вызывайте его везде, где вам нужно.

Я думаю, что отчасти проблема заключается в том, как проект C # Winforms связан с проектом C ++ MFC. Если C ++ кодирует простую библиотеку обработки, то оболочка C ++ / CLI звучит правильно для меня. Если приложение C ++ является основным и загружает проект C # для сбора этой информации, тогда может быть что-то еще лучше.

0 голосов
/ 16 декабря 2010

Я разработал проект, который я знал, чтобы смешать C # и C ++ с событиями, но мой код фактически отстал от того, что вы хотите: он запускает делегаты C # из C ++. Может быть достаточно ключевых слов, чтобы указать вам правильное направление:

    public: static void Fire(Delegate^ del, ... array<System::Object^>^ args)
    {
        if (nullptr == del)
            return;

        array<Delegate^>^ delegates = del->GetInvocationList();

        for each (Delegate^ sink in delegates)
        {
            try
            {
                //sink->DynamicInvoke(args);
                System::Windows::Forms::Form^ f;
                f = dynamic_cast<System::Windows::Forms::Form^>(sink->Target);
                if (f) {
                    f->Invoke(sink, args);
                } else {
                    sink->DynamicInvoke(args);
                }
            }
            catch(Exception^ e)
            {
                Trace::WriteLine("EventsHelper.Fire");
                Trace::WriteLine(e->Message);
            }

        } // end for each

    } // end Fire
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...