Полагаю, вы имеете в виду моно-специфический способ обмена данными / выполнения вызовов между стороной C и управляемой (C #) стороной в одном и том же процессе (для разных процессов вам придется использовать сокет, такой как tcp / ip, и разработайте протокол или используйте существующий в соответствии с вашими потребностями).
Во-первых, для вызова функции C из управляемого кода у вас есть два основных механизма:
- вызов P / Invoke (подробнее см. http://www.mono -project.com / Interop_with_Native_Libraries ), используя «__Internal» в качестве имени dll для поиска функции в исполняющей программе вместо внешней библиотека
- вызов InternalCall: это управляемый метод, реализованный в виде функции C, простой пример см. Samples / embed / teste.c в моноисточниках
Основное различие между ними заключается в том, что при 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 ().
При внедрении mono обычно используется очень короткий метод Main (), используемый только для инициализации, поэтому mono_jit_exec () быстро возвращается, и вы можете управлять всем из основного потока на стороне C.
Если вы запускаете отдельный поток, убедитесь, что вы вызываете mono_thread_attach () внутри него, прежде чем вызывать любую другую монофункцию или манипулировать управляемыми объектами в ней.