簡體   English   中英

在Mono中將C ++暴露給C#:函數的無效轉換?

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

我正在通過將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. argv的論據mainchar**
  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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM