Предоставление класса ISO С++ для С#
Мне нужно открыть некоторые С++-классы для С# (я строю на Linux, используя моно, поэтому COM не является вариантом)
Доказательства, которые я собрал до сих пор, показывают, что лучший способ приблизиться к этому:
- Записать оболочку С++. Класс Net в классе ISO С++
- Используйте С++. Чистые классы из С#
У меня есть следующие вопросы:
- Во-первых, является ли это "лучшим" способом достижения цели предоставления классов ISO С++ для С#?
- Пока что я не видел примеров, которые действительно показывают, как это сделать - может ли кто-нибудь предложить некоторые ссылки или фрагмент кода, чтобы показать, как это делается для фиктивного класса?
- Как отправить асинхронные уведомления из кода С++ на код С#? В идеале я хотел бы заставить класс С# поднять событие, а полученные данные в качестве аргумента
Ответы
Ответ 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;
};
Я надеюсь, что эта помощь
рассматривает