Или вы можете use the mono CLR embedder
Управляемый код может вызывать неуправляемый код двумя способами [с помощью P/Invoke или] с помощью low-level Mono embedding API.
Это очень похоже на старомодное вложение интерпретатора Perl, Python или Ruby (фактически, виртуальных машин) в ваш исполняемый файл C/C++. Я не думаю, что есть на самом деле такая вещь, как глоток (++) генератор обертки для этого (пока), но вот фрагмент того, что вызов в CIL код выглядит следующим образом:
class MyClass {
static void Foo (int value) {
...
}
int Bar (string name) {
...
}
}
предполагается, что вы получили соответствующий монометод * в foo_method и bar_method и this_arg является MonoObject * типа MyClass, вы просто выполнить:
/* we execute methods that take one argument */
void *args [1];
int val = 10;
/* Note we put the address of the value type in the args array */
args [0] = &val;
/* execute Foo (10);
* it's a static method, so use NULL as the second argument.
*/
mono_runtime_invoke (foo_method, NULL, args, NULL);
/* a string is a reference, so we put it directly in the args array */
args [0] = mono_string_new (domain, "Hello");
/* execute my_class_instance.Bar ("Hello");
* See the Creating Objects section to learn how to get this_arg.
*/
MonoObject *result = mono_runtime_invoke (bar_method, this_arg, args, NULL);
/* we always get a MonoObject* from mono_runtime_invoke(), so to get
* the integer value we need to unbox (which returns a pointer to
* the value stored in the object) and dereference.
*/
int int_result = *(int*)mono_object_unbox (result);
за дополнительной ценностью развлечения: если вы АОТ-компиляцию всего кода CIL , вы сможете статически связать свою сборку в ваш собственный двоичный файл (эффективно выполняющий то, что Managed C++ (C++ - cli) вызывает сборки смешанного режима). Посмотрите на
mono --aot=static myassembly.dll
и
mkbundle
Подключите, вернитесь когда * это * работает. –