Или вы можете использовать моно CLR Embedder
Управляемый код может вызывать неуправляемый код двумя способами: [с использованием P / Invoke или] с помощью низкоуровневого API встраивания Mono .
Это работает во многом как старомодное встраивание интерпретатора Perl, Python или Ruby (фактически, виртуальных машин) в исполняемый файл C / C ++. Я не думаю, что на самом деле есть такая вещь, как генератор оболочки Swig (++) для этого (пока), но вот фрагмент того, как выглядит вызов в CIL-код:
class MyClass {
static void Foo (int value) {
...
}
int Bar (string name) {
...
}
}
при условии, что вы получили соответствующий MonoMethod * в 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);
Для дополнительной развлекательной ценности : если вы AOT-скомпилируете весь свой код CIL, вы сможете статически связать вашу сборку в свой собственный двоичный файл (эффективно делая то, что управляло C ++ (c ++ - cli) вызывает сборки в смешанном режиме). Посмотрите на
mono --aot=static myassembly.dll
и
mkbundle