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 ...
随机推荐
- SQL Server 致程序员(容易忽略的错误)
标签:SQL SERVER/MSSQL/DBA/T-SQL好习惯/数据库/需要注意的地方/程序员/容易犯的错误/遇到的问题 概述 因为每天需要审核程序员发布的SQL语句,所以收集了一些程序员的一些常见 ...
- Sublime Text3配置在可交互环境下运行python快捷键
安装插件 在Sublime Text3下面写代码感觉很不错,但是写Python的时候遇到了一些问题. 用Sublime Text3打开python文件,或者在Sublime Text3下写好pytho ...
- 常见CSS与HTML使用误区
误区一.多div症 <div class="nav"> <ul> <li><a href="/home/"> ...
- java字符乱码
在java中处理字符时,经常会发生乱码,而主要出现的地方在读取文本文件时发生,或者是写入到文件中,在其他地方打开乱码. 如下例子: BufferedReader br = null; try { br ...
- 使用Oracle官方巡检工具ORAchk巡检数据库
ORAchk概述 ORAchk是Oracle官方出品的Oracle产品健康检查工具,可以从MOS(My Oracle Support)网站上下载,免费使用.这个工具可以检查Oracle数据库,Gold ...
- iOS开发之再探多线程编程:Grand Central Dispatch详解
Swift3.0相关代码已在github上更新.之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD ...
- 树莓派 基于Web的温度计
前言:家里的树莓派吃灰很久,于是拿出来做个室内温度展示也不错. 板子是model b型. 使用Python开发,web框架是flask,温度传感器是ds18b20 1 硬件连接 ds18b20的vcc ...
- 远程连接mysql 1130错误解决方法
- 自定义ConfigSection
CCustom configuration section with intelisense
- 微信小程序之用户数据解密(七)
[未经作者本人同意,请勿以任何形式转载] 经常看到有点的小伙伴在群里问小程序用户数据解密流程,所以打算写一篇关于小程序用户敏感数据解密教程: 加密过程微信服务器完成,解密过程在小程序和自身服务器完成, ...