Можно ли вызвать управляемую DLL из неуправляемого C ++? - PullRequest
8 голосов
/ 16 июня 2010

Можно ли вызвать CLR DLL (например, созданную на C #) из неуправляемого кода C ++?

Мне нужна DLL, которую не удалось как-то вызвать, может быть, даже через какой-то прокси-процесс C ++, который построен на C ++ / CLI?

Ответы [ 3 ]

6 голосов
/ 16 июня 2010

CLR DLL должна быть построена как видимая сборка COM.Если у вас есть контроль над C #, это простая перестройка, в противном случае практически невозможно использовать ее напрямую.

5 голосов
/ 16 июня 2010

@ SWeko дал вам лучший ответ, если вы можете изменить исходную DLL, и ваш неуправляемый код может полагаться на доступ к COM-квартире (либо его собственный поток с вызванным ::CoInitialize(), либо вызывающий поток неуправляемого кода согласованная квартира).

Если это не так, то лучшим решением является создание «управляемой» C ++ DLL в качестве оболочки для управляемой сборки C #. Это называется C ++ / CLI. Вы можете предоставлять неуправляемые операции C API и внутри их реализации делегировать управляемым API. Он работает довольно хорошо, и, в отличие от вызова COM API, проблем со схожестью потоков нет.

4 голосов
/ 16 июня 2010

Я не уверен, что он подходит, но возможно "Reverse PInvoke" - вариант.

Если вы можете сначала вызвать ваш C # на ваш C ++, то вы можете предоставить делегат .net на C ++, где он может использоваться в качестве указателя на функцию. Затем вы можете вызывать ваш C ++ в C #, используя этот указатель на функцию.

public delegate int Read(int target);
[DllImport("yourC++.dll")]
static extern void RegisterRead(Read x);
Read m_Read = new Read(yourClass.Read);

RegisterRead(m_Read);

Могут быть некоторые уловки с GC, собирающим делегата рано, любой класс, имеющий делегат, может нуждаться в закреплении, если он не используется сразу в RegisterRead

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