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