您的位置:首页 > 编程语言 > C#

mono嵌入式应用研究(二):虚拟机的初始化

2016-04-05 10:20 821 查看
mono本身是用ASNI C开发的,所以mono的使用也就是调用一堆API,mono使用的句柄和类型对外开放时都被隐藏了,比如MonoClass、MonoObject,对外声明的都只是空结构指针,mono的API返回的对象,类型相关的比如MonoClass、MonoClassField是跟随Assembly存在的,不需要自己释放。获得一些托管代码的对象,比如MonoObject、MonoString这些指针只是当前有效,随时可能被移动或销毁,一般不能长期保存。如需要长期保存,可使用mono_gchandle_new将其添加引用后转化为堆句柄保存,使用时用mono_gchandle_get_target来获取对应的MonoObject,不需要后需要使用mono_gchandle_free来释放引用,以使其能被gc回收。另外还有一些API的返回也需要自己手动释放,比如mono_string_to_utf8返回的字符串需要使用mono_free来释放。

总之,mono的API文档非常简陋,几乎可以说没什么文档,所以使用起来很吃力,经常需要去看mono提供的例子和mono的源码来摸索正确的使用方法。

mono初始化的开始是调用mono_jit_init初始化并创建一个AppDomain,AppDomain是C#程序运行的一个独立环境,不同AppDomain内的对象是不能被相互访问的,相当于一个隔离作用。在我的插件式服务器构架里,除了主AppDomain外,我使用mono_domain_create_appdomain为每一个插件创建了一个AppDomain,以使插件之间可以相互隔离不干扰。mono_jit_init需要传入一个c#的dll文件名,mono从这个dll中获取AppDomain的名称和.net
framework的版本。dll文件名如果不是一个直接可加载路径的话,mono会从设置好的assembly路径去寻找,mono_set_assemblies_path可以来设置这个查找路径。另外使用mono_jit_init_version可以直接传入AppDomain名称和.net framework的版本号来创建AppDomain,而不需要通过一个dll。

另外在如果有一些特别需求的话,在调用mono_jit_init创建一个AppDomain前,我们还可以做一些别的事情:

mono_trace_set_log_handler、mono_trace_set_print_handler、mono_trace_set_printerr_handler这三个API可以设置自己的mono信息和错误日志处理函数,而不是直接输出到终端。

mono_set_assemblies_path可以设置assembly查找路径。

mono_set_config_dir可以设置mono的配置文件路径,主要是做一些外部dll引用函数的重映射。

mono_config_parse直接解析给定的mono配置文件。

mono_debugger_agent_parse_options为mono的远程调式代理设置一些参数,例如:“transport=dt_socket,address=127.0.0.1:12345,server=y,suspend=y”表示在地址127.0.0.1端口12345开启调试代理侦听,mono虚拟机启动后挂起,等待调式客户端连接进入后继续运行。

mono_debug_init这个执行了远程调式代理的初始化,等mono_jit_init时调试代理就会启动。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mono c# 嵌入式