Возможный назвать управляемый DLL от неуправляемого C++?

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

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

8
задан torrential coding 5 May 2012 в 01:00
поделиться

3 ответа

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

6
ответ дан 5 December 2019 в 11:22
поделиться

Я не уверен, что он подходит, но, возможно, вариант "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);

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

4
ответ дан 5 December 2019 в 11:22
поделиться

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

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

5
ответ дан 5 December 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: