Я пишу систему плагинов, встраивая Mono в мою C ++ программу для Windows.
Прямо сейчас я пытаюсь представить функцию C ++ для среды выполнения C #, чтобы сценарии могли вызывать функции C ++ из основной программы.
Это сделано так:
mono_add_internal_call("Hello::MonoMsg",MonoMsg);
У меня есть все, кроме приготовленной коппасты из двух примеров, и оба страдают одной и той же ошибкой:
C:\Projects\MonoTestBed\main.cpp|34|error: invalid conversion from 'void (*)(MonoString*)' to 'const void*'|
C:\Projects\MonoTestBed\main.cpp|34|error: initializing argument 2 of 'void mono_add_internal_call(const char*, const void*)'|
Теперь, я нашел сообщение одного человека об этом / где-то /, но я не нашел решения, только способ заставить его скомпилировать — приведите MonoMsg как (void *) MonoMsg. Это заставит его скомпилироваться, но затем он сломается, вылетит kerblam, когда вы запустите его — он сообщит, что функция не найдена.
Вот соответствующий код и включает на всякий случай, если вы тоже этого хотите.
#include <iostream>
#include <stdio.h>
#include <string>
#include<mono/jit/jit.h>
#include<mono/metadata/assembly.h>
#include <mono/metadata/mono-config.h>
#include <mono/metadata/mono-debug.h>
#include <mono/metadata/debug-helpers.h>
#include <mono/metadata/appdomain.h>
#include <mono/metadata/object.h>
#include <mono/metadata/threads.h>
#include <mono/metadata/environment.h>
#include <mono/metadata/mono-gc.h>
using namespace std;
__declspec(dllexport) void MonoMsg(MonoString *msg)
{
cout<<msg;
}
int main(int argc, char *argv)
{
// mono_set_dirs(NULL,NULL);
// mono_config_parse(NULL);
MonoDomain *domain = mono_jit_init("C:\\herro.exe");
MonoAssembly *assembly= mono_domain_assembly_open(domain,"C:\\herro.exe");
cout<<assembly;
//mono_jit_exec(domain,assembly,0,NULL);
mono_add_internal_call("Hello::MonoMsg",MonoMsg);
. . .
РЕДАКТИРОВАТЬ: Я почти забыл упомянуть, что это какой-то, P / invoke подход? или что-то. :
Изменения, необходимые для работы вашего кода:
argv
аргумент main
является char**
argc
а также argv
в mono_jit_exec
mono_jit_exec
Что-то вроде этого:
int main(int argc, char **argv)
{
MonoDomain *domain = mono_jit_init("C:\\herro.exe");
MonoAssembly *assembly= mono_domain_assembly_open(domain,"C:\\herro.exe");
cout<<assembly;
mono_add_internal_call("Hello::MonoMsg",MonoMsg);
mono_jit_exec(domain,assembly,argc,argv);
Вы забыли указать пространство имен. Предполагая, что вы скомпилировали Hello
класс в пределах YourAssembly
namespace, следующее исправление исправит это.
mono_add_internal_call("YourAssembly.Hello::MonoMsg",MonoMsg);