#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.
Комментариев нет:
Отправить комментарий