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 ...
随机推荐
- 分布式系列文章——从ACID到CAP/BASE
事务 事务的定义: 事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元(Unit),狭义上的事务特指数据库事务. 事务的作用: 当多个应用程序并发访问 ...
- 移动端访问PC站点时自动跳转至移动站点
方法一: 百度Site APP的uaredirect.js 实现手机访问,自动跳转 <script src="http://siteapp.baidu.com/static/webap ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- UVa 122 Trees on the level
题目的意思: 输入很多个节点,包括路径和数值,但是不一定这些全部可以构成一棵树,问题就是判断所给的能否构成一棵树,且没有多余. 网上其他大神已经给出了题目意思:比如我一直很喜欢的小白菜又菜的博客 说一 ...
- Spring注解
AccountController .java Java代码 1. /** 2. * 2010-1-23 3. */ 4. packag ...
- jquery.each()
$(selector).each(function(index,element)) index - 选择器的 index 位置 element - 当前的元素(也可使用 "this" ...
- arcgis api for js入门开发系列七图层控制(含源代码)
上一篇实现了demo的地图分屏对比模块,本篇新增图层控制模块,截图如下(源代码见文章底部): 图层控制模块实现的思路如下: 1.在地图配置文件map.config.js里面配置图层目录树节点信息,作为 ...
- Register-SPWorkflowService 404
最近需要做一个SharePoint 2013工作流演示环境. 于是在自己的本子上安装了一个虚拟机. 虚拟机操作系统是Windows Server 2012 R2,计划把AD.SQL Server 20 ...
- iOS 自定义方法 - 不完整边框
示例代码 ///////////////////////////OC.h////////////////////////// //// UIView+FreeBorder.h// BHBFreeB ...
- A*算法应用[转]
转自:http://www.cnblogs.com/zhoug2020/p/3468167.html 这是一篇十分精彩/易懂的博客,感谢原博主!本文通过自己的理解在原博文基础上突出一些重点字眼,句子. ...