Делегаты в SWIG - C # - PullRequest
       11

Делегаты в SWIG - C #

6 голосов
/ 06 июля 2011

(полная копия http://old.nabble.com/C%2B%2B-pointer-to-method-as-parameter-to-C--td17645155.html, но не удалось заставить предложенный макрос работать)

У меня есть следующая функция C ++ (упрощенно):

InputPort addInputPort(void(*callback)(InputPort));

Проблема: подпись сгенерированной функции C #:

public InputPort addInputPort(SWIGTYPE_p_f__InputPort____void callback)

SWIGTYPE_p_f__InputPort____void не является делегатом (и в любом случае не имеет открытого конструктора), поэтому я не могу использовать addInputPort.

Как мне сказать SWIG использовать делегата вместо этого?Если решение включает% typemap, , пожалуйста, будьте со мной терпеливы ...

1 Ответ

1 голос
/ 21 ноября 2012

Решение включает% typemap. Эффект, который вы видите, является бесполезным отображением по умолчанию для неизвестных типов. В вашем случае неизвестный тип - это тип функции void *(InputPort).

Фактически, весь перевод SWIG основан на% typemaps, которые уже написаны и живут в стандартных библиотеках SWIG. Вы можете исследовать начальные% typemaps для C # в этом Subversion местоположении .

В частности, ищите SWIGStringHelper в csharphead.swg . Этот код сопоставляет делегата с обратным вызовом C. Хитрость заключается в добавлении вспомогательной реализации обратного вызова в модуль SWIG.

...