Подтвердить что ты не робот

Предоставление класса ISO С++ для С#

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

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

  • Записать оболочку С++. Класс Net в классе ISO С++
  • Используйте С++. Чистые классы из С#

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

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

Ответ 1

Вы не можете делать классы С++/.NET в Linux с помощью Mono. Моно не поддерживает Managed С++ или С++/CLI, поэтому нет возможности "Создать оболочку С++. Класс Net в классе ISO С++".

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

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


Edit:

Для официального "Mono не поддерживает смешанный режим С++/CLI", см. Страница Языки:

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

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

Ответ 2

Недавно Mono сделал некоторые довольно большие шаги с совместимостью на С++ в CXXI (произносится как сексуальный).

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

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

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

Ответ 3

вам пришлось написать управляемый wraper С++ вокруг вашего класса iso С++, подобного этому

 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;
    };

Я надеюсь, что эта помощь рассматривает