Предоставление класса ISO C ++ для C # - PullRequest
14 голосов
/ 08 апреля 2010

Мне нужно представить некоторые классы C ++ для C # (я строю на Linux, используя моно, поэтому COM не подходит)

Доказательства, которые я до сих пор собирал, указывают на то, что лучший способ подойти к этомуis:

  1. Написать оболочку класса C ++. Net вокруг класса ISO C ++
  2. Использование классов C ++. Net из C #

У меня есть следующеевопросы:

  • Во-первых, является ли это "наилучшим" способом достижения цели представления классов C ++ ISO для C #?
  • Пока что я не видел примеров, которые на самом делепокажите, как это сделать - кто-нибудь может предложить какие-нибудь ссылки или фрагмент кода, чтобы показать, как это делается для фиктивного класса?
  • Как я могу отправлять асинхронные уведомления от кода C ++ в код C #?В идеале я хотел бы, чтобы класс C # вызывал событие с полученными данными в качестве аргумента

Ответы [ 3 ]

8 голосов
/ 08 апреля 2010

Вы не можете делать классы C ++ / .NET в Linux, используя Mono.Mono не поддерживает Managed C ++ или C ++ / CLI, поэтому нет способа «написать оболочку класса C ++. Net вокруг класса ISO C ++».

Для этого лучше всего создать API Cдля вашего класса C ++, к которому можно получить доступ через Platform Invoke .

При этом, один из способов облегчить это - использовать SWIG для создания упаковщиков для вас.,Он поддерживает создание оболочек C # из классов C ++ (а также оболочек для других языков) и хорошо работает в Linux / Mono.


Редактировать:

Для официального "Mono не«Не поддерживает смешанный режим C ++ / CLI», см. страницу Languages ​​:

Важно отметить, что любой язык, который компилируется в чистый IL, должен работать в Mono.Некоторые языки, такие как Microsoft Managed C ++, не всегда компилируются в чистый IL, поэтому они не всегда будут работать должным образом, поскольку они не являются действительно независимыми от платформы.

C ++ / CLI для нативного взаимодействия требуетчистый IL, поэтому он не будет работать на Mono.

3 голосов
/ 12 февраля 2012

Mono недавно сделал несколько довольно больших успехов с совместимостью C ++ в CXXI ​​ (произносится сексуально).

Из этой публикации рассказывается, что новая технология CXXI ​​позволяет разработчикам C # / .NET:

  • Легко использует существующие классы C ++ из C # или любого другого .NET язык
  • Создание экземпляров объектов C ++ из C #
  • Вызов методов C ++ в классах C ++ из кода C #
  • Вызовите встроенные методы C ++ из кода C # (при условии, что ваша библиотека скомпилирована с -fkeep-inline-functions или вы предоставили суррогат библиотека)
  • Подкласс C ++ классов из C #
  • Переопределение методов C ++ методами C #
  • Предоставление экземпляров классов C ++ или смешанных классов C ++ / C # для кода C # и C ++, как если бы они были нативным кодом.

CXXI ​​является результатом двух лет работы Google Summer of Code над улучшением взаимодействия Mono с языком C ++.

0 голосов
/ 08 апреля 2010

вы должны были написать управляемую оболочку c ++ для вашего класса iso c ++, как это

 public ref class MyWrapper
    {
    public:
    MyWrapper (void)
    {
    pObj = new CMyUnmanagedClass();
    }
    ~MyWrapper (void)
    {
    delete pObj;
    }
    int foo(void)
    {
    //pass through to the unmanaged object
    return pObj->foo();
    }
    private:
    CMyUnmanagedClass* pObj;
    };

надеюсь, это поможет С уважением

...