我正在尝试使用libmono在C应用程序中嵌入一个C#类,但文档有点缺乏.
我正试图用原型调用方法 void MessageToSend(out MessageObject message);
我如何表示"out参数"?它是指向MonoObject的指针吗?谢谢.
PS.就libmono而言,'out'和'ref'参数是一样的吗?
我有兴趣听听人们在C/C++应用程序中嵌入单声道(.NET的开源实现)的经验.如何分发这样的应用程序以及依赖性是什么?我已经测试了OS X和mono作为一个巨大的框架(数百MB).我的应用程序的用户都需要这个大框架,或者可以将其删除或将所有内容编译到主可执行文件中.
我以前有过在一个C++应用程序中嵌入Lua的经验,这非常有效,因为我可以将整个lua解释器与我的主可执行文件静态链接.所以我没有外部依赖.是否可以用单声道做类似的事情?
这里的任何Lua人都能评论他们如何发现单声道与Lua相比?
PS:嵌入我指的是一个C++应用程序,它初始化单声道环境并加载.NET程序集并执行它,然后允许在程序集中的C#代码和主可执行文件中的C++方法之间进行通信.
如何使用单声道嵌入式调用创建通用List <String>对象?我可以获得List的MonoClass:
MonoClass* list = mono_class_from_name(mscorlibimage,
"System.Collections.Generic", "List`1");
Run Code Online (Sandbox Code Playgroud)
我在文档中看到有
mono_class_from_generic_parameter(MonoGenericParam*...)
Run Code Online (Sandbox Code Playgroud)
但我不知道在哪里以及如何获得MonoGenericParam.或许我需要为mono_class_from_name构建一个有效的名称?我觉得这可能有点慢,但我现在接受了.我试过了
MonoClass* list = mono_class_from_name(mscorlib::get().image, "System.Collections.Generic", "List`1[System.String]");
Run Code Online (Sandbox Code Playgroud)
但没有运气.
更新:
好的我找到了办法.我仍然想知道是否有正式的做事方式,因为这个黑客对我来说太脏了.
基本上我搜索了通用方法的单一来源,并找到了mono_class_bind_generic_parameters(参见https://raw.github.com/mono/mono/master/mono/metadata/reflection.c).除了.so之外,我还必须链接到libmono-2.0.a才能使用它.但它有效:
extern "C" MonoClass*
mono_class_bind_generic_parameters(MonoClass *klass,
int type_argc, MonoType **types, bool is_dynamic);
MonoClass* list = mono_class_from_name(mscorlib::get().image,
"System.Collections.Generic", "List`1");
MonoClass* strcls = mono_class_from_name(mscorlib::get().image, "System", "String");
printf("str class: %p\n", strcls);
MonoType* strtype = mono_class_get_type(strcls);
printf("str type: %p\n", strtype);
MonoType* types[1];
types[0] = strtype;
list = mono_class_bind_generic_parameters(list, 1, types, false);
printf("list[string] class: %p\n", list);
MonoObject* obj = mono_object_new(domain, list); …
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何从C调用泛型方法(静态和非静态).
最大的罪魁祸首是调用泛型方法基本上没有文档记录,单声道存储库中没有示例,但有人提到这可能在文档中是可能的:
If you want to invoke generic methods, you must call the method on the "inflated" class, which you can obtain from the mono_object_get_class()
MonoClass *clazz;
MonoMethod *method;
clazz = mono_object_get_class (obj);
/*
* If there are more Add methods declared, you
* may use mono_method_desc_search_in_class (clazz, ":Add(T)"),
* you must substitute ":Add(T)" with the correct type, for example
* for List<int>, you would use ":Add(int)".
*/
method = mono_class_get_method_from_name (clazz, "Add", 1);
mono_runtime_invoke (method, obj, args, &exception);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并没有那么有用,因为它没有显示完整的示例,无论我做什么(使用 …
我正在尝试使用 SGen GC 将 Mono 嵌入到c
程序中,如http://www.mono-project.com/docs/advanced/embedding/中。在 Mono 发行版中,C:\Program Files\Mono\bin
有两种不同的具有 SGen 支持的 Mono DLL:
该教程说On Windows, depending on the GC implementation to be used (... SGen), you need to link your application with ... monosgen-2.0.lib
,但它没有说明我必须使用什么 dll。我很困惑,因为本教程说我应该重命名libmonosgen-2.0.dll
为monosgen-2.0.dll
(但为什么?)。示例程序可以在这两个库中编译并正常工作。Dependency Walker 显示libmonosgen-2.0.dll
导出的符号比monosgen-2.0.dll
. 那么这些库之间的实际区别是什么?
我在谈论使用C#进行游戏编程的小型游戏引擎.所以,我有一个嵌入单声道运行时的C++应用程序(我称之为'启动程序').我有一个用C#编写的程序集,它是我的游戏引擎类库.启动程序按照Embedding Mono中的建议启动程序集.
而现在有趣的部分!启动器实现了C++ miscelaneous函数,这些函数作为我的游戏引擎类的内部方法暴露给单声道运行时.这就是为什么我的游戏引擎组件没有启动器,它在C++中实现了大部分引擎.
问题:我应该如何调试我的C#程序集?而更重要的是,我应该如何调试我将用C#编写的游戏?
如您所知,我无法使用MonoDevelop Debugger调试程序集,因为它不会接收某些方法的内部C++实现.
我需要的是运行启动器.然后启动器将使用嵌入式单声道运行时启动C#程序集.然后我需要一些东西连接到已启动的程序集以允许其调试.
或任何其他方式.谢谢!
我已将单声道运行时嵌入到我的C++应用程序中.C++代码调用一个返回bool值的C#方法.
如何从返回的MonoObject中获取bool值?
MonoObject* res = mono_runtime_invoke(my_method_instance, processor_, nullptr, nullptr);
bool result = *how does this work??*;
Run Code Online (Sandbox Code Playgroud)