暴露C++;到单声道中的C#:函数转换无效? 我通过在Windows的C++程序中嵌入MNO来编写插件系统。 现在我尝试向C++运行时公开C++函数,以便脚本可以从主程序调用C++函数。p>

暴露C++;到单声道中的C#:函数转换无效? 我通过在Windows的C++程序中嵌入MNO来编写插件系统。 现在我尝试向C++运行时公开C++函数,以便脚本可以从主程序调用C++函数。p>,c#,c++,mono,cil,void,C#,C++,Mono,Cil,Void,这是这样做的: 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 a

这是这样做的:

   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*)'|
现在,我找到了一个人关于这个/somewhere/的帖子,但我没有找到解决方案,只有一种方法可以让它编译-将MonoMsg转换为(void*)MonoMsg。这会让它编译,但当你运行它时,它会崩溃,崩溃Kerbrum——它会报告找不到该函数

这是相关的代码,包括以防万一你也需要

#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);

    . . .
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
__declspec(dllexport)void MonoMsg(MonoString*msg)
{

cout使代码正常工作所需的更改:

  • main的
    argv
    参数是
    char**
  • 您应该将
    argc
    argv
    传递给
    mono\u jit\u exec
  • 您应该在调用
    mono\u jit\u exec之前添加内部调用
  • 大概是这样的:

    int main(int argc,char**argv)
    {
    MonoDomain*domain=mono_jit_init(“C:\\herro.exe”);
    MonoAssembly*assembly=mono_domain_assembly_open(域,“C:\\herro.exe”);
    
    cout您忘了指定名称空间。假设您在
    yoursassembly
    名称空间中编译了
    Hello
    类,下面的更正将修复它

    
    mono\u add\u internal\u调用(“yoursassembly.Hello::monosg”,monosg);
    

    对我来说仍然失败