Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Взаимодействие C# и C++

#c_sharp #cpp #net #cppbuilder


Есть dll-ка написанная на C# и есть программа написанная на Borland С++ которая жаждет
использовать методы реализованные в dll-ке. 

Вопрос: Как это взаимодействие лучше организовать если:


dll-ка при необходимости (если такое изменение понадобится для организации взаимодействия
с С++) может превратиться в exe или даже службу
некоторые методы реализованные в dll в силу особенностей .Net ощутимо долго отрабатывают
при первом вызове. Да и dll-ке желательно проводить
некоторую подготовительную работу (обновлять используемые файлы и
тп.) и лучше если она будет делать это один раз за весь цикл работы
вызывающей программы. 
dllка полностью в моей власти могу изменять её код как мне угодно. программа на C++
вне моей власти. Максимум что мне доступно-объяснить разработчикам как использовать
мою dllку.
Желательна схема не требующая дополнительных действий (перерегистрация/перезапись
реестра/переустановка компонентов и т.п.) при обновлении dllки.
производительность критична.


PS: Отдельное спасибо за пример реализации такого взаимодействия на Builder C++ 
    


Ответы

Ответ 1



На мой взгляд самый простой способ - это написание промежуточной dll на C++\CLI, который позволяет с одной стороны нормально экспортировать методы через __declspec(dllexport), а с другой нормально вызывать методы из библиотек, которые написаны на C#. Когда сам интересовался этим вопросом, то плагины для VS не работали корректно, по-моему, из-за кирилицы (может за пару лет стало лучше), а вручную декомпилировать библиотеку и вносить изменения в MSIL быстро надоело.

Ответ 2



Самый простой способ - просто экспортировать нужные функции из DLL с помощью библиотеки UnmanagedExports. Скачать ее и подключить к проекту можно через NuGet. Инициализацию библиотеки можно проводить в статическом конструкторе. Или же можно воспользоваться паттернами ленивой инициализации. Если нужно более сложное взаимодействие - можно использовать COM. Регистрировать интерфейсы и фабрики классов в реестре не обязательно - достаточно экспортировать функцию, которая вернет COM-интерфейс. Пример такого кода есть на сайте UnmanagedExports.

Комментариев нет:

Отправить комментарий