У меня есть 2 компонента:
— .Приложение Net Core, работающее в ОС Ubuntu.
— Совместная библиотека C ++ (.so)
Теперь я хочу, чтобы компонент C ++ мог вызывать метод .Net Core, либо передавая интерфейс компоненту C ++, который будет использовать этот интерфейс для реализации метода обратного вызова, либо передавая метод в качестве параметра компоненту C ++.
Пример высокого уровня, чего я пытаюсь достичь:
Компонент C #:
public interface IDevice
{
void OnDataAvailable(string data);
}
public class Device: IDevice
{
[DllImport("sampleCPPLibrary.so")]
private static extern int SetReceiver(IDevice receiver);
public void OnDataAvailable(string data)
{
Console.WriteLine(data);
}
public void Initialize()
{
SetReceiver(IDevice(this))
}
}
Компонент C ++:
extern "C" {
void SetReceiver(IReceiver * receiver)
{
receiver->OnDataAvailable(10);
}
}
По сути, я пытаюсь передать некий «обратный вызов» компоненту C ++ и вызвать этот «обратный вызов», когда в компоненте C ++ происходит какое-то событие.
Увидеть Смотрите эту проблему из комментариев я построил код, где C # вызывает C и дает ему callback-делегат. Таким образом, из C он вызывает C # и передает дополнительный аргумент типа int. Смотрите комментарии здесь от проекта Endurox, и приложил c-callback.tar.gz для рабочего примера.
Других решений пока нет …