C++ вызывает параметры C#
У нас есть собственный код Win32 C++ и набор сборок C#, которые мы хотим вызвать из кода C++. Я описываю наши варианты как:
Используйте COM. Код C# должен быть украшен дополнительными атрибутами (GUID, COMVisible). Сборки C# должны быть зарегистрированы regasm и затем будут доступны для собственного кода C++ через COM.
Используйте класс-оболочку C++/CLI (ранее управляемый C++). Класс C++ может быть добавлен в собственный проект C++. Этот класс будет скомпилирован с /clr. Собственный код C++ будет вызывать класс C++ / CLI, который затем будет вызывать код.Net. СОМ не участвует. CLR запускается по волшебству, как требуется, с маршалингом, обрабатываемым расширениями C++ / CLI.
Разместите экземпляр CLR в собственном коде C++.
Я собираюсь сделать скидку на вариант 3, так как не вижу преимуществ перед вариантом 2, кроме того, что мы теряем необходимость в классе-обёртке. Таким образом, вопрос в том, каковы плюсы / минусы варианта 1 по сравнению с вариантом 2?
Заранее спасибо.
3 ответа
Вариант 2 будет работать лучше и будет самым беспроблемным и обслуживаемым, IMO.
Там действительно нет никакого преимущества для варианта 1, который я нашел. Использование C++/CLI, кажется, работает намного лучше, работает быстрее и в целом намного проще.
Кстати, вы также можете просто использовать сборку C# без использования класса-оболочки. Это требует компиляции любых файлов, которые хотят использовать его с /CLR, но это работает довольно хорошо.
С вариантом 2 у вас также есть довольно простой способ впоследствии преобразовать все ваше приложение в C++/CLI, чтобы избежать управляемых / неуправляемых переходов, которые вы получите. Переходы могут быть проблемой, в зависимости от того, как вы используете ваши сборки, на которые ссылаются, то есть от снижения производительности.
До сих пор у меня был только положительный опыт работы с C++/CLI, и я могу рекомендовать этот путь.
Для варианта 1 вашему главному профессионалу не нужно было бы писать класс-обертку, который может стать волосатым в зависимости от вашего проекта.
Для варианта 2 вам не придется изменять управляемую библиотеку, чтобы упростить неуправляемое использование, что иногда не подходит.
Для меня все сводится к тому, где вы хотите внести изменения в код.