C++ вызывает параметры C#

У нас есть собственный код Win32 C++ и набор сборок C#, которые мы хотим вызвать из кода C++. Я описываю наши варианты как:

  1. Используйте COM. Код C# должен быть украшен дополнительными атрибутами (GUID, COMVisible). Сборки C# должны быть зарегистрированы regasm и затем будут доступны для собственного кода C++ через COM.

  2. Используйте класс-оболочку C++/CLI (ранее управляемый C++). Класс C++ может быть добавлен в собственный проект C++. Этот класс будет скомпилирован с /clr. Собственный код C++ будет вызывать класс C++ / CLI, который затем будет вызывать код.Net. СОМ не участвует. CLR запускается по волшебству, как требуется, с маршалингом, обрабатываемым расширениями C++ / CLI.

  3. Разместите экземпляр CLR в собственном коде C++.

Я собираюсь сделать скидку на вариант 3, так как не вижу преимуществ перед вариантом 2, кроме того, что мы теряем необходимость в классе-обёртке. Таким образом, вопрос в том, каковы плюсы / минусы варианта 1 по сравнению с вариантом 2?

Заранее спасибо.

3 ответа

Решение

Вариант 2 будет работать лучше и будет самым беспроблемным и обслуживаемым, IMO.

Там действительно нет никакого преимущества для варианта 1, который я нашел. Использование C++/CLI, кажется, работает намного лучше, работает быстрее и в целом намного проще.

Кстати, вы также можете просто использовать сборку C# без использования класса-оболочки. Это требует компиляции любых файлов, которые хотят использовать его с /CLR, но это работает довольно хорошо.

С вариантом 2 у вас также есть довольно простой способ впоследствии преобразовать все ваше приложение в C++/CLI, чтобы избежать управляемых / неуправляемых переходов, которые вы получите. Переходы могут быть проблемой, в зависимости от того, как вы используете ваши сборки, на которые ссылаются, то есть от снижения производительности.

До сих пор у меня был только положительный опыт работы с C++/CLI, и я могу рекомендовать этот путь.

Для варианта 1 вашему главному профессионалу не нужно было бы писать класс-обертку, который может стать волосатым в зависимости от вашего проекта.

Для варианта 2 вам не придется изменять управляемую библиотеку, чтобы упростить неуправляемое использование, что иногда не подходит.

Для меня все сводится к тому, где вы хотите внести изменения в код.

Другие вопросы по тегам