Вызов C # из собственного C ++, без / clr или COM?

Этот вопрос задавали раньше, но я так и не нашел по-настоящему удовлетворительного решения -

У меня есть библиотека классов, написанная на C #, и я хочу вызвать ее из устаревшего нативного приложения C ++. Хост-приложение действительно является родным, скомпилировано в Windows и Linux, это консольное приложение. Итак, как я могу заставить его вызывать библиотеку классов C #, предполагая, что используется Microsoft .NET в Windows и Mono в Linux.

Я просмотрел SWIG и упаковку с COM-интерфейсами в Windows, но есть ли стандартное признанное решение, которое работает на кросс-платформе? то есть это общий, работает как с Microsoft .NET, так и с Mono, реализация для однократной записи используется везде.

Решения должны предоставлять полные интерфейсы классов из домена C # в домен C ++.

Подобные вопросы касаются только решений Windows, например -

Вызов методов C # из C ++ без использования COM


person titanae    schedule 22.08.2009    source источник
comment
Вы должны спросить моно-парней, экспортировали ли они это и как.   -  person Billy ONeal    schedule 22.08.2009


Ответы (2)


Если вы хотите использовать эту кроссплатформенную платформу, я бы рекомендовал использовать подход 100% Mono.

Mono имеет чистый API встраивания, который работает в Linux и Windows.

person Reed Copsey    schedule 22.08.2009
comment
Хороший ответ, встраивание Mono в Windows не совсем то, что я искал, и все это выглядит очень вручную. Вам придется написать много шаблонного кода, чтобы предоставить библиотеке полный интерфейс, он выглядит трудоемким и хрупким, напоминает мне JNI. Мне было интересно, есть ли какой-то автоматический способ, например SWIG или просто раскрытие COM-интерфейса. - person titanae; 22.08.2009
comment
COM работает хорошо, но не так хорошо на Linux. СВИГ годится только для того, чтобы пойти другим путем ... Извини. - person Reed Copsey; 22.08.2009

С .NET 5.0 (преемник ядра .NET) теперь можно вызывать C # из C ++ кроссплатформенным способом без использования Mono. См. Объяснение решения в этом выпуске Github с использованием DNNE для создания общей библиотеки и GCHandles. для доступа к объектам C #.

Благодаря этому вы получаете общую библиотеку, которую можно использовать из C или C ++. Обратите внимание, что это даст C-подобный API (без объектов, как при использовании extern C в C ++), в будущем могут появиться такие инструменты, как SWIG для C ++, чтобы преодолеть это ограничение.

person Gabriel Devillers    schedule 01.08.2020
comment
Пожалуйста, разместите код в строке. Если это невозможно, укажите ссылку непосредственно на фрагмент кода, а не на проблему с github, содержащую несколько комментариев. - person Gili; 02.08.2020
comment
@Gili - это фрагмент, демонстрирующий интерфейс C #, который можно вызвать с помощью этого метода: github.com/dotnet/docs/issues/18174#issuecomment-642124735 Людям следует обратиться к документации DNNE о том, как создать DLL. Это очень новая функция (.NET 5.0 все еще находится в стадии бета-тестирования), но, поскольку она нигде не упоминалась в SO, я предположил, что было бы нормально пока не иметь больше встроенного контента. Более того, другой ответ оказался полезным (+5), несмотря на отсутствие встроенного кода. - person Gabriel Devillers; 02.08.2020