在 Mono 中向 C# 公开C++:函数转换无效

Exposing C++ to C# in Mono: invalid conversion of function?

本文关键字:函数 转换 无效 C++ 公开 Mono 中向      更新时间:2023-10-16

我正在通过将Mono嵌入到Windows的C++程序中来编写插件系统。现在,我正在尝试向 C# 运行时公开一个C++函数,以便脚本可以从主程序调用C++函数。

这是这样完成的:

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

我几乎煮熟了两个示例的复制面,并且都遇到相同的错误:

C:ProjectsMonoTestBedmain.cpp|34|error: invalid conversion from 'void (*)(MonoString*)' to 'const void*'|
C:ProjectsMonoTestBedmain.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/调用方法?什么的。

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

  1. main argv论点是char**
  2. 您应该将argcargv传递给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);

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

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