2

Windows用のC++プログラムにMonoを埋め込んでプラグインシステムを作成しています。現在、スクリプトがメインプログラムからC ++関数を呼び出せるように、C ++関数をC#ランタイムに公開しようとしています。

これは次のように行われます。

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

私は2つの例のコピーパスタをほとんど調理しましたが、どちらも同じエラーが発生します。

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 /に関する1人の投稿を見つけましたが、解決策は見つかりませんでした。コンパイルする方法だけです。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アプローチであると言うのをほとんど忘れていましたか?か何か。:

4

2 に答える 2

1

コードを機能させるために必要な変更:

  1. argv引数mainchar**
  2. あなたは通過する必要がありargcますargvmono_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);
于 2013-02-03T16:29:51.200 に答える
0

名前空間を指定するのを忘れました。Hello名前空間内でクラスをコンパイルしたと仮定するとYourAssembly、次の修正で修正されます。

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

于 2016-05-31T02:13:03.417 に答える