В прошлом я делал это разными способами. Я обнаружил, что C ++ / CLI был лучшим вариантом для построения моста между .Net и неуправляемым C ++ (хотя, как отмечалось другими авторами, COM в другом варианте).
Способы, которыми я занимался в прошлом, включают:
- Генерация кода оболочки C ++ / CLI API из моего C ++ API с использованием отражения. Конечно, нативный C ++ не имеет системы отражения, поэтому мы развернули свою собственную. Сгенерированный код C ++ / CLI был затем скомпилирован в сборку, на которую ссылается плагин C #.
- Генерация динамической сборки из моего C ++ API с использованием отражения (т. Е. С использованием вещи Reflection.Emit). Получившаяся сборка может быть использована в процессе для языков сценариев, или вы даже можете скомпилировать код C # против нее во время выполнения. Сборка может быть даже записана на диск для статического использования. Недостатком здесь является то, что вы, вероятно, не можете излучать лучше IL, чем компилятор, поэтому, если вам не нужна динамическая генерация, не идите по этому пути.
- Рукописные оболочки C ++ / CLI API. Если API не очень большой, написать обертку вручную достаточно просто.
В конце концов у вас будет сборка для плагинов C # для компиляции. Теперь вам нужно загрузить сборки плагинов во время выполнения. Для этого необходимо разместить CLR.
Размещение CLR не сложно, хотя я сделал это только один раз, и это было несколько лет назад - возможно, времена изменились. Если вам неудобно размещать CLR, то поместите как можно больше кода вашего приложения в библиотеки DLL, а затем напишите небольшое приложение на C ++ / CLI, которое отображает ваш неуправляемый пользовательский интерфейс. Теперь CLR размещается в небольшом приложении C ++ / CLI.