在Mono中将C ++暴露给C#:函数转换无效?

时间:2013-02-02 22:40:44

标签: c# c++ mono cil void

我正在通过将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方法?或者其他的东西。 :

2 个答案:

答案 0 :(得分:1)

使代码运行所需的更改:

  1. argv的{​​{1}}参数为main
  2. 您应该将char**argc传递给argv
  3. 您应该在调用mono_jit_exec
  4. 之前添加内部呼叫

    这样的事情:

    mono_jit_exec

答案 1 :(得分:0)

您忘记指定命名空间。假设您在Hello命名空间内编译了YourAssembly类,以下更正将修复它。

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