我正在通过将Mono嵌入到我的Windows C ++程序中来编写插件系统。 现在我正在尝试将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*)'|
现在,我找到了一个关于this / somewhere /的帖子,但我没有找到解决方案,只有一种方法可以让它编译 - 将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方法?或者其他的东西。 :
答案 0 :(得分:1)
使代码运行所需的更改:
argv
的{{1}}参数为main
char**
和argc
传递给argv
mono_jit_exec
这样的事情:
mono_jit_exec
答案 1 :(得分:0)
您忘记指定命名空间。假设您在Hello
命名空间内编译了YourAssembly
类,以下更正将修复它。
mono_add_internal_call("YourAssembly.Hello::MonoMsg",MonoMsg);