Как вызвать методы c # (mono, .net), делегаты из нативного c - PullRequest
4 голосов
/ 23 ноября 2010

возможно ли вызывать методы c #, написанные в управляемом коде (может быть, в классе или библиотеке) из собственного кода c (и как)?

ТНХ

edit: с "c #" я в основном ссылаюсь на mono или даже portable.net, а ОС Linux

Ответы [ 3 ]

6 голосов
/ 24 ноября 2010

Ваш код на C может определять функции для регистрации обратных вызовов. Код C # может P / вызывать эти функции и передавать управляемые делегаты в качестве аргументов. Код маршаллинга будет прозрачно преобразовывать их в указатели на C-функции.

В качестве альтернативы, подходя к нему со стороны C, вы можете использовать API встраивания Mono для загрузки сборок, поиска MonoMethods и их вызова.

Использование API встраивания намного сложнее. Если ваша точка входа находится в C, вам придется использовать API встраивания, но, вероятно, проще просто написать управляемый метод для регистрации обратного вызова и любой другой управляемой установки, тогда вам нужно только загрузить и вызвать этот единственный метод из кода С.

3 голосов
/ 23 ноября 2010

На сайте MSDN есть Обзор взаимодействия управляемого и неуправляемого кода , который может пролить свет на вас.Ниже приведена выдержка:

Прямой доступ к управляемому API

Если неуправляемый клиент написан на C ++, его можно скомпилировать с помощью Visual Studio .NET C ++Компилятор как «изображение в смешанном режиме».После этого неуправляемый клиент может получить прямой доступ к любому управляемому API.Однако некоторые правила кодирования применяются для доступа к управляемым объектам из неуправляемого кода;обратитесь к документации C ++ для получения более подробной информации.

Прямой доступ является предпочтительным вариантом, поскольку он не требует какого-либо особого внимания со стороны разработчиков управляемого API.Они могут разрабатывать свои управляемые API в соответствии с руководящими принципами разработки управляемых API (DG) и быть уверенными в том, что API по-прежнему будут доступны для неуправляемых абонентов.

Предоставление управляемого API в качестве COM API

Каждый общедоступный управляемый класс может быть доступен неуправляемым клиентам через COM-взаимодействие.Этот процесс очень прост в реализации, потому что уровень взаимодействия COM заботится обо всей COM-сантехнике.Таким образом, например, каждый управляемый класс, по-видимому, реализует IUnknown, IDispatch, ISupportErrorInfo и несколько других стандартных интерфейсов COM.

Несмотря на то, что представление управляемых API-интерфейсов в качестве COM-API является простым, управляемые и объектные модели COMОчень разные.Следовательно, предоставление управляемого API для COM всегда должно быть явным дизайнерским решением.Некоторые функции, доступные в управляемом мире, не имеют аналогов в мире COM и не могут быть использованы клиентами COM.Из-за этого часто возникают противоречия между рекомендациями по разработке управляемого API (DG) и совместимостью с COM.

Если важны клиенты COM, напишите свой управляемый API в соответствии с рекомендациями по разработке управляемого API, а затем напишите тонкийУдобная для COM управляемая оболочка вокруг вашего управляемого API, которая будет доступна для COM.

Представление управляемого API в виде плоского API

Иногда неуправляемые клиенты не могут использовать COM.Например, они могут быть уже написаны для использования плоских API и не могут быть изменены или перекомпилированы.C ++ является единственным языком высокого уровня, который позволяет вам представлять управляемые API как простые API.Сделать это не так просто, как представить управляемый API как COM API.Это очень продвинутый метод, который требует глубоких знаний взаимодействия C ++ и различий между управляемым и неуправляемым миром.

Представьте управляемый API как плоский API, только если это абсолютно необходимо.Если у вас нет выбора, обязательно ознакомьтесь с документацией C ++ и полностью осознайте все ограничения.

0 голосов
/ 22 июля 2011

Вот решение. Для вызова функции C # из C используется атрибут [DllExport] (напротив P / Invoke DllImport) https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

...