Поддержка С++/CLI в .Net Core
Наша структура проекта похожа на
native.dll
: - содержит чистый нативный код, написанный на c\С++.
Этот native.dll предоставляет некоторые функции, используя * def файл.
Wrapper Library(wrapper.dll compiled with .Net framework v4.0)
: -
Чтобы использовать функциональные возможности native.dll
, a Wrapper lib(wrapper.dll)
записывается в C++\CLI
с помощью :clr\oldsyntax
. У этой обертки есть все
код Interoperability
и Marshalling
.
Application(Console App v4.0)
использует wrapper.dll
для использования функциональности
на native.dll
.
Теперь этот проект должен выполняться в .Net Core. Это означает, что у нас будет
.Net Core application
, который будет reference wrapper.dll
, который, в свою очередь, будет ссылаться
native.dll
.
Я знаю, что это не будет работать напрямую. Но проблема в поддерживает ли .NET Core (CoreCLR)
С++\CLI (clr\oldsyntax) среда выполнения ?
Если нет, какие могут быть возможные решения для этого приложения?
Ответы
Ответ 1
whether.Net Core(CoreCLR) supports C++\CLI (clr\oldsyntax) runtime environment?
Насколько я знаю, не планируется поддерживать C++/CLI с .NET Core.
Если нет, какие могут быть возможные решения для этого приложения?
Вы можете (должны) предоставить C API. Mono e. грамм. поддерживает P/Invoke и .NET Core также поддерживает P/Invoke (см. также этот вопрос о переполнении стека и этот связанный с DllMap тикет).
Ответ 2
Команда .net Core обязуется (сейчас?) поддерживать C++/CLI только для Windows.
Намерением было поставить его для .net Core 3.0. Хотя я еще не нашел явного упоминания об этом в примечаниях к выпуску, поддержка C++/CLI была необходимым условием для доставки WPF (только для Windows), которая теперь поддерживается в .net Core 3.0.
Поддержка сборок в смешанном режиме в Windows - # 18013
Эта проблема (# 18013) будет отслеживать прогресс в поддержке загрузки и работы сборки в смешанном режиме на CoreCLR. Основная цель - оказать поддержку для WPF и другого существующего кода C++/CLI в .NET Core. Некоторые работы будет зависеть от обновлений компилятора MSVC.
Проблема github (# 659), упомянутая выше @Tomas-Kubes, Будет ли CoreCLR поддерживать C++/CLI кросс-платформу? - # 659, про кроссплатформенный C++/CLI.
Кстати, я получаю предупреждения компилятора о "clr\oldsyntax" с VS2017/.net-4.7. Так что этот флаг компилятора уже устарел.
ОБНОВЛЕНИЕ: Этоне будет до .Net Core 3.1
Ответ 3
Еще одно потенциальное решение (хотя, очевидно, довольно сложная задача), если вы хотите придерживаться С++ (т.е. выставить OO-интерфейс для .NET), возможно, это посмотреть CppSharp из монопроекта. Он способен выставлять собственный С++-код через автоматически создаваемую оболочку С#. Он поддерживает Windows, Linux и OSX. Тем не менее, я не знаю, сгенерированный код может быть скомпилирован в стандартную цель .NET(не пытался). Я могу только предположить, что это было бы потому, что сгенерированный код не использует какой-либо фантастический API (это в основном interop и marshalling code); и, кстати, также можно настроить процесс генерации (хотя, опять же, возможно, это непростая задача).
Ответ 4
Официально объявлено в конце концов...
(следующее желание... поддержка linux @.Net 5 ^^)
https://devblogs.microsoft.com/cppblog/the-future-of-cpp-cli-and-dotnet-core-3/
C++/CLI будет иметь полную поддержку IDE для таргетинга на .NET Core 3.1 и выше. Эта поддержка будет включать проекты, IntelliSense и отладку смешанного режима (IJW) в Windows. У нас нет планов на использование C++/CLI для macOS или Linux. Кроме того, компиляция с использованием '/clr: pure' и '/clr: safe' не будет поддерживаться для .NET Core.
Первые публичные превью для C++/CLI уже не за горами. Visual Studio 2019 16.4 Preview 1 включает обновленный компилятор с '/clr: netcore'
Обновление: От ответа отправителя:
"Мы все еще работаем над интеграцией IDE и MSBuild, поэтому я пока не могу поделиться примером проекта. Как только он будет доступен, вероятно, с 16.4 Preview 2 или 3"
(16.4 Preview1 не может создать C++/CLI с проектом .NetCore.)
191015
16.4 Preview2 выпущен.
Я пробовал asp.net core 3.1 с C++/CLI dll, все работает.
(необходимо установить пластину на x64 как ядро asp.net, так и dll C++/CLI)