У меня есть два варианта, о которых я знаю:
1) Вы можете скомпилировать C # DLL с поддержкой COM, а затем получить доступ к ней из C ++ через COM. Это будет связано с COM-взаимодействием, которое может быть медленнее, чем управляемые вызовы .NET.
Чтобы скомпилировать C # DLL с поддержкой COM, перейдите в Свойства проекта-> Приложение-> Информация о сборке-> Сделать сборку видимой. Вы используете regasm для регистрации библиотеки DLL на компьютере пользователя. Это похоже на использование regsvr32, за исключением того, что regasm для .NET DLL:
http://www.csharphelp.com/archives/archive190.html
Лично я также использую ключ / CODEBASE с regasm для DLL, которые я собираюсь использовать только для COM. Он по-прежнему будет работать без ключа / CODEBASE, но DLL также будет отображаться в глобальном кэше сборок, который просто добавляет беспорядок в GAC и дает вам ряд функций, которые мне не нужны для сценариев взаимодействия COM.
Вы также можете установить «Регистрация для COM-взаимодействия» в Build, но это не обязательно. Это просто полезно при многократной отладке, так как при компиляции он регистрирует COM DLL с regasm на вашей машине. Это на самом деле не имеет ничего общего с самой DLL. Вам все равно нужно будет повторно выполнить DLL на компьютерах пользователя.
После регистрации вы сможете добавить ссылку на COM в DLL C # и выполнять вызовы из нативного C ++ точно так же, как и любой другой компонент COM.
или
2) Вы можете скомпилировать проект C ++ как управляемый проект C ++ / CLI, что позволит вам ссылаться на библиотеки .NET DLL, такие как C # DLL. Я думаю, что это был бы лучший вариант, если C ++ / CLI не проблема для вас. Вызовы между кодом C ++ / CLI и C # DLL должны работать лучше, чем COM Interop, но с другой стороны, сам C ++ / CLI немного медленнее, чем собственный C ++.