Возможно, вы имеете в виду моно-специфический способ обмена данными/выполнения вызовов между стороной C и управляемой (C#) стороной в одном и том же процессе (для разных процессов вам придется использовать сокет, например tcp/ip , а также разработать протокол или использовать существующий в соответствии с вашими потребностями).
Во-первых, для вызова функции C внутри управляемого кода у вас есть два основных механизма:
- P/Invoke вызова (см http://www.mono-project.com/Interop_with_Native_Libraries для более подробной информации), используя «__Internal» в качестве имени длл для поиска функция в выполняемой программе вместо внешней библиотеки
- вызов InternalCall: это управляемый метод, реализованный в виде функции C, см образцы/код вставки/teste.c в моно источников для простого примера
Основное различие b между двумя является то, что с P/Invoke происходит сортировка данных (например, управляемая строка становится строкой char * на стороне C), тогда как с icalls вы получаете прямой доступ к управляемым объектам.
Главный механизм для перехода в другую сторону (вызов управляемого метода из C) заключается в вызове mono_runtime_invoke(). samples/embed/test-invoke.c имеет несколько примеров.
Еще один способ - перенести делегата с использованием P/Invoke: на стороне C вы получите указатель на функцию, который вы можете сохранить (до тех пор, пока вы сохраните управляемый объект делегирования, сохраняя его в статическом поле в управляемом классе, например). Позже вы можете позвонить с помощью указателя функции на стороне C, и вы автоматически перейдете в управляемый мир.
Если сборка, выполняемая с помощью функции mono_jit_exec(), работает долго, вам необходимо выполнить mono_runtime_invoke() в отдельном потоке, который вы запустили до вызова mono_jit_exec().
При встраивании моно обычно используется очень короткий метод Main(), используемый только для инициализации, поэтому mono_jit_exec() возвращается быстро, и вы можете управлять всем из основного потока на стороне C.
Если вы запустите отдельный поток, обязательно вызовите mono_thread_attach() внутри него, прежде чем вызывать любую другую монофункцию или управлять управляемыми объектами в ней.
Я надеюсь использовать моно, чтобы я мог его изучить. –