embedding mono实战笔录(一)
最近在给自己的服务器节点添加脚本功能,考虑到 执行性能、开发效率、调试效率、可维护性、严谨性 五大要素,最终选用C#作为脚本语言,并使用mono作为中间层,使其具备跨平台特性,以备具有在Windows开发调试并在Linux部署的效果。这样就完全符合五大要素了。
开始研究嵌入mono的方法,结果并非我想的半天搞定,而是花了我两天的时间,google和bing都搜了个遍,没有直接可解决问题的答案,真是命途多舛。我使用的是mono 4.6版本,在Windows下进行测试,有几个坑需要备忘一下:
1)检查环境变量Path是否包含mono安装目录下的bin目录,当然没有也不要紧,因为我用的是embedding。但是最好还是设置一下,有备无患,里面有不少小工具可以用,包括mcs。
2)记得包含%MonoRoot%/include/mono-2.0和%MonoRoot%/lib目录进项目中,当然这是基本所有程序都会做的。
3)在调用任何任何有关mono的api之前,必须先调用mono_config_parse(0)函数,这个我看了好久的文档都没有告诉我,还是看别人的代码才明白要放在第一个调用。该函数记得#include <mono/metadata/mono-config.h>
4)想要提升性能,就必须使用mono_method_get_unmanaged_thunk()函数来获取一个函数指针,并保存起来以备以后调用。但是!这里有两个大坑,请一定要以这种形式来定义函数指针:
typedef void(* __stdcall TestDelegate)(int, MonoException**); // vc
typedef void(* __attribute__((__stdcall)) TestDelegate)(int, MonoException**); // gcc
是的!一个是__stdcall调用约定,也许在Debug模式下有栈保护,你查不出问题,但是到了Release你就等着傻吧,这个太坑了,要不是我偶然间看到stackoverflow上的帖子,被玩死估计也不晓得有这么回事啊,明明是C库,你给个stdcall不是坑人么。心中一万个草泥马奔腾......
还有个巨坑就是后面的MonoException**参数一定要加上啊!!!!!不加上你就会发现一个莫名其妙的异常错误......而且表现的极其诡异,你每次调用函数之前,重新调用一次mono_method_get_unmanaged_thunk()函数就没事,否则就会抛异常,真是巨坑无比,官方文档里对于这个问题只字未提,我也是千千万万个草泥马奔腾了......坑的我一脸老血,各种文章和博客里都是跟官方文档一样的写法。我觉得这些人一定是随便研究研究就放文章出来了,根本没有用于实际项目去使用。因为你调用了mono_method_get_unmanaged_thunk()函数之后立即使用这个函数指针来调用函数,是完全没有问题的!要中间执行一些代码,再去使用这个函数指针,就会给你报错了。所以,一定要在最后一个参数上传入获取异常对象的地址位置......
embedding mono实战笔录(一)的更多相关文章
- 【Quote】What is Mono
What is Mono Mono is a software platform designed to allow developers to easily create cross platfor ...
- Embedding和Word2Vec实战
在之前的文章中谈到了文本向量化的一些基本原理和概念,本文将介绍Word2Vec的代码实现 https://www.cnblogs.com/dogecheng/p/11470196.html#Word2 ...
- 【Xamarin挖墙脚系列:Mono项目的图标为啥叫Mono】
因为发起人大Boss :Miguel de lcaza 是西班牙人,喜欢猴子.................就跟Hadoop的创始人的闺女喜欢大象一样...................... 历 ...
- 在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验
准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). 不懂Mono的请移步张善友大神的:国内 Mono 相关文章汇总 不懂Jexus为何物 ...
- Linux.NET实战手记—自己动手改泥鳅(上)
各位读者大家好,不知各位读者有否阅读在下的前一个系列<Linux.NET 学习手记>,在前一个系列中,我们从Linux中Mono的编译安装开始,到Jexus服务器的介绍,以及如何在Linu ...
- 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>
一.引子 开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...
- 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...
- 在 Azure 上使用 Docker运行 Mono
Docker 是最近相当热门的一个名词,它是一个基于 Linux Container 的轻量化的虚拟技术,而微软也相当积极与 Docker 合作,在 Azure 上支持这个火热的技术,并且提供简单的方 ...
- Xamarin Mono For Android 4.6.07004 完整离线安装破解版(C#开发Android、IOS工具)
Xamarin是由Miguel de Icaza成立的一家新的独立公司,目的是给Mono一个继续奋斗的机会.Mono for Android (原名:MonoDroid)可以让开发人员使用 Mic ...
随机推荐
- 通过一个demo了解Redux
TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...
- 菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
- TODO:小程序开发过程之体验者
TODO:小程序开发过程之体验者 1. 小程序开发过程,先下载开发者并安装开发者工具,现在腾讯开放测试了,普通用户也可以登录开发者工具,如图普通用户登录为调试类型,但是只能建立无AppID的项目 如果 ...
- div实现自适应高度的textarea,实现angular双向绑定
相信不少同学模拟过腾讯的QQ做一个聊天应用,至少我是其中一个. 过程中我遇到的一个问题就是QQ输入框,自适应高度,最高高度为3row. 如果你也像我一样打算使用textarea,那么很抱歉,你一开始就 ...
- 基于DFA敏感词查询的算法简析
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要对敏感词做一个过滤,首先有几个方案可以选择: a.直 ...
- IT运维监控解决方案介绍
现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...
- Javascript中的valueOf与toString
基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...
- NSStringCompareOptions
typedefNS_OPTIONS(NSUInteger, NSStringCompareOptions) { NSCaseInsensitiveSearch = 1, //不区分大小写比较 N ...
- 如何快速开发SPA应用
前言 web早已经进入了2.0时代了,如今的网页大有往系统应用级别的方向发展的趋势,再也不是以前的简单展示信息的界面了.如今很多webapp已经做到了原生应用的功能,并且运用自身的优势逐步取代之.HT ...
- 斗天斗地斗控件 -- 与 Flyout 控件的斗争史
前言 在淘宝的收藏夹页面本地化过程中,收藏的宝贝和店铺的分类展示通过一个下拉菜单的方式进行展示.如果单独为此从头重写一个控件,那么不但费时费力,包括所有的动画方式都要全新设计,而且还容易出 bug.好 ...