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的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时调试代理就会启动。
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#比较二个数组并找出相同或不同元素的方法