2010-11-03 2 views
1

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

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

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

Спасибо,

MJ

ответ

3

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

1

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

+0

Я надеюсь использовать моно, чтобы я мог его изучить. –

Смежные вопросы