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

Posted

技术标签:

【中文标题】在 Mono 中将 C++ 暴露给 C#:函数的无效转换?【英文标题】:Exposing C++ to C# in Mono: invalid conversion of function? 【发布时间】:2013-02-02 22:40:44 【问题描述】:

我正在编写一个插件系统,将 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*)'|

现在,我找到了一个人关于这个 /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);

    . . .

编辑:我差点忘了提到这是某种 erm P/invoke 方法?或者其他的东西。 :

【问题讨论】:

【参考方案1】:

使您的代码工作所需的更改:

    mainargv 参数是 char** 您应该将argcargv 传递给mono_jit_exec 你应该在调用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);

【讨论】:

对我来说仍然失败【参考方案2】:

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

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

【讨论】:

以上是关于在 Mono 中将 C++ 暴露给 C#:函数的无效转换?的主要内容,如果未能解决你的问题,请参考以下文章

将非托管 c++ 类库暴露给 c#

调试从 C++ 调用的 C# dll(嵌入 Mono)

通过单声道将数组从 C++ 传递给 C#

C#编组来自C++ DLL的无符号字符返回值[重复]

C# 中的无符号字符使用哪种数据类型?

如何在c ++中调用将类对象返回给c#的函数