Mono C для работающей программы на C # - PullRequest
1 голос
/ 03 ноября 2010

Я смотрю на связь между программой на C ++ и программой на C # с использованием Mono.На веб-сайте Mono есть несколько хороших примеров встраивания Mono в программу на C, запуска программы на C # и последующей связи между ними.

mono_domain_assembly_open используется для открытия сборки C #, а mono_jit_exec используется для ее запуска.

Мой вопрос: возможно ли "подключиться" к уже работающей сборке?Мне кажется, что вызов mono_jit_exec не нужен, поскольку сборка C # уже выполняется.Вместо этого будет альтернативный вызов "связать" программы на C и C #?

Спасибо,

mj

Ответы [ 2 ]

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

Полагаю, вы имеете в виду моно-специфический способ обмена данными / выполнения вызовов между стороной 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 () внутри него, прежде чем вызывать любую другую монофункцию или манипулировать управляемыми объектами в ней.

1 голос
/ 03 ноября 2010

Вам нужно будет использовать какой-то тип IPC (межпроцессное взаимодействие), поскольку ваша C-программа не контролирует C # -программу.Возможными путями могут быть именованные каналы, что-то вроде связи TCP / IP, удаленное взаимодействие (не уверен, что это применимо к моно).

...