Предоставление C ++ для C # в Mono: неверное преобразование функции?

Я пишу систему плагинов, встраивая 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 подход? или что-то. :

2

Решение

Изменения, необходимые для работы вашего кода:

  1. argv аргумент main является char**
  2. ты должен пройти argc а также argv в mono_jit_exec
  3. Вы должны добавить внутренний звонок до Вы вызываете 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);
1

Другие решения

Вы забыли указать пространство имен. Предполагая, что вы скомпилировали Hello класс в пределах YourAssembly namespace, следующее исправление исправит это.


mono_add_internal_call("YourAssembly.Hello::MonoMsg",MonoMsg);

0

По вопросам рекламы [email protected]