Как динамически загрузить C # dll из C ++ DLL - PullRequest
7 голосов
/ 02 июня 2011

У меня есть приложение на C ++. Это поддерживает пользовательские DLL-библиотеки плагинов C ++, они будут динамически загружать эти DLL, а затем смогут динамически создавать и использовать типы пользователей. Эти пользовательские типы являются производными от базовых типов и интерфейсов, определенных в основной библиотеке основного приложения, поэтому я держу объекты пользователя как указатели на базовый класс и вызываю виртуальные функции пользователя, чтобы их волшебство произошло.

Теперь я хочу расширить библиотеки плагинов, чтобы разрешить управляемые библиотеки DLL (я забочусь о C # в основном). Я хочу, чтобы все то же волшебство происходило в библиотеках плагинов C #.

Как я могу динамически загружать эти dll, как я думаю, что LoadLibrary win32, который я сейчас использую, будет доволен управляемой DLL. У меня не будет доступа к этим библиотекам во время компиляции / компоновки, они приходят от пользователя.

После того, как я загрузил библиотеку, к сожалению, я подозреваю, что COM в будущем станет способом вызова производных функций. Возможно, я мог бы использовать оболочку CLI / C ++, о которой я читал, но я здесь очень неопытен и буду признателен за любые советы или ссылки на соответствующие статьи.

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

Еще один способ сделать это - создать проект C ++ / CLI, в котором будут размещены ваши классы C #, и использовать его как мост в вашем проекте C ++.

Еще несколько ссылок на этот подход:

Последняя ссылка содержит простой исходный код моста

2 голосов
/ 02 июня 2011

То, что вы должны сделать, - это запустить экземпляр CLR в вашем процессе. Посмотрите эту статью на CLR хостинге

0 голосов
/ 25 апреля 2012

Вот несколько слайдов, которые описывают мое решение.

https://docs.google.com/presentation/pub?id=1YoJRGnveh4By7ym4GL19L7OzYOFORZQB6RgJEPVfFb8&start=false&loop=false&delayms=3000

Мое решение состояло в том, чтобы установить плагин win32 dll, загруженный обычным способом (LoadLibrary), который ссылается на смешанный C ++ /CLI DLL, которая ссылается на чистый управляемый код C #.Я допускал, чтобы вызовы происходили в обоих направлениях, используя ОЧЕНЬ много котлов, а также шаблон двойного моста c ++ / cli, основанный на ссылке, заданной Паду.Детали были довольно сложными, но работа конечного пользователя API очень проста, и это было моей целью.Модуль записи управляемого управляемого плагина просто наследуется от объекта, и все просто работает.

По сути, я создал шаблон, который обеспечивает «псевдо наследование в смешанном режиме». Теперь мои объекты c # происходят от базового класса в c ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...