Как вызвать .NET (C #) код из родной C (++) DLL? - PullRequest
4 голосов
/ 19 января 2011

У меня есть C # app.exe и один C # my.dll. Проект my.dll .NET ссылается на собственную C ++ DLL (mynat.dll) (внешний интерфейс C DLL), и вызов из C # в C ++ DLL работает без проблем. (Используя атрибут [DllImport("mynat.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)].)

Теперь мне нужно добавить, чтобы dll C # предоставлял некоторые функции обратного вызова, в которые может вызываться код C ++. В идеале код C ++ mynat.dll должен использовать LoadLibrary ("my.dll") для загрузки DLL C #, а затем использовать GetProcAddress для разрешения функции обратного вызова, которую он может затем вызвать. (Обратите внимание, что в тот момент, когда код C ++ вызывает LoadLibrary, DLL-библиотека my.dll C # уже загружена в процесс - этот вызов будет просто для того, чтобы получить указатель на dll.)

Однако я не знаю, как правильно экспортировать «внешний интерфейс C DLL» из .NET DLL

Что мне нужно сделать, чтобы достичь этого?

Ответы [ 2 ]

2 голосов
/ 19 января 2011

Вопреки распространенному мнению, возможно .
См. здесь .

0 голосов
/ 18 августа 2011

Хотя ссылка , предоставляемая SLaks на неуправляемую утилиту экспорта, может работать или не работать, мы использовали аналогичный инструмент (из другого источника) здесь и из-за проблем с подписанными исполняемыми файлами отказались от этого подхода.

Мы пришли к следующему заключению и сделаем это в будущем:

Правильный способ сделать обратные вызовы .NET доступными для чистых собственных модулей - это написать проект C ++ / CLR, который выполняет обратные вызовы дляв сборку .NET и экспортирует собственный интерфейс.

[ .NET ] -> ----------- -> [ C(++) ]  ... via DllImport Attribute

[ .NET ] <- [ C++/CLR ] <- [ C(++) ]  ... "default" .NET interface + "default" native interface
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...