Регистрация функции делегата с обратным вызовом ISO C ++ (на моно) - PullRequest
2 голосов
/ 09 апреля 2010

Я выставляю некоторые типы данных ISO C ++ для .Net (моно в Linux, если быть точным).

В целях краткости я буду ссылаться на C # в своем вопросе, хотя мой вопрос касается всех языков .Net (причем C # и VB.Net являются моими целевыми языками).

До сих пор я работал над тем, как представить типы данных ISO C ++ в классах C # для использования в моно - благодаря некоторым умным парням из SO.

Пока единственная проблема - как обращаться с обратными вызовами C ++. Я считаю, что в языках .Net (C # и Vb.Net) «делегаты» являются эквивалентом обратного вызова.

На данный момент придерживаясь C #, кто-нибудь может порекомендовать способ регистрации функций делегирования C # в моем коде ISO C ++.

Код ISO C ++ является библиотекой уведомлений, и я хочу иметь возможность "отправлять" уведомления в моно-фреймворк (т. Е. Делегаты C # в этом случае).

Мое основное предположение состоит в том, что механизм / шаги для реализации этого будут одинаковыми для языков .Net - мне просто нужно будет кодировать фактических делегатов на выбранном языке .Net - верно ли это предположение?

И последнее, но не менее важное, это вопрос безопасности потоков. Базовый код ISO C ++, который я раскрываю для .Net (моно, если быть более точным), является и ретрантным, и потокобезопасным. Должен ли я сделать что-нибудь «дополнительное» для вызова делегата .Net из моего кода ISO C ++?

1 Ответ

1 голос
/ 09 апреля 2010

Просто убедитесь, что указатель функции, который вы определяете и используете в C ++, имеет связь с C. Затем вы можете экспортировать функцию C, которая принимает указатель функции в качестве аргумента, и вы будете вызывать P / с делегатом в качестве аргумента из C #.

Со стороны C ++ вы просто будете вызывать указатель на функцию в обычном режиме.

Обратите внимание, что вам придется поддерживать живой объект делегата до тех пор, пока может быть вызван обратный вызов C, вероятно, сохранив делегат в статической переменной или аналогичной, если обратный вызов C должен быть сохранен для выполнения позднее Время, чем регистрация.

В остальном, вы не можете безопасно вызывать управляемый код из обработчиков сигналов: кроме этого, пока ваш управляемый код является реентерабельным и потокобезопасным, также будет комбинация delgate / callback.

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