Передача неуправляемого метода в качестве обратного вызова в управляемый класс C ++ / CLI - PullRequest
0 голосов
/ 10 апреля 2020

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

Итак, в неуправляемом C ++ моего проекта C ++ / CLI у меня есть объект функции: std::function<void(int)>callback;

This Функция происходит из моего C ++ проекта, и она работает нормально, я сохраню ее в качестве примера, чтобы избежать предыдущего шага. Теперь я хотел бы передать эту функцию обратного вызова в мой проект C#. Для этого я создаю метод в неуправляемом C ++, передаю его в управляемый C ++ и с этого момента, наконец, передаю его C#. Я хотел бы что-то вроде этого:

// Unmanaged class
public class Wrapper
{
public:
    std::function<void(int)>callback;

    void ReturnToCallback(int data)
    {
        callback(data);
    }

    void PassCallback()
    {
        NETWrapper netWrapper;
        netWrapper.TestCallback(ReturnToCallback);
    }
};

//Managed class
public ref class NETWrapper
{
public:
    void TestCallback(Action<int>^ callback)
    {
       StartGenerator^ startGen = gcnew StartGenerator(callback);
    }
};

// C# 
public class StartGenerator
{
    private Communication comm;

    public StartGenerator(Action<int> callback)
    {
        comm = Communication.Instance;
        comm.callback = callback;
    }
}

Это решение, конечно, возвращает мне ошибку при компиляции:

Ошибка 3 ошибка C3867: 'IfaceXXX :: Wrapper :: ReturnToCallback ': вызов функции без списка аргументов; используйте '& IfaceXXX :: Wrapper :: ReturnToCallback', чтобы создать указатель на член d: \ XXX.h

Я пробовал другие способы, такие как Получить делегат для указателя функции, чтобы я мог работать над Управлял C ++ и передаю его C#, но я не могу правильно его реализовать. Как вы думаете, это лучший способ попробовать это?

1 Ответ

1 голос
/ 10 апреля 2020
  1. Сделать Wrapper::callback указатель на std::function.
  2. Изменить оболочку на ref class.

Вот и все.

public ref class Wrapper
{
public:
    std::function<void(int)>* callback;

    void ReturnToCallback(int data)
    {
        (*callback)(data);
    }

    void PassCallback()
    {
        NETWrapper netWrapper;
        netWrapper.TestCallback(gcnew Action<int>(this, &Wrapper::ReturnToCallback));
    }
};

Теперь вам нужно управлять временем жизни std::function сейчас, возможно, my clr_scoped_ptr сможет показать вам, как это сделать.

...