最近在给自己的服务器节点添加脚本功能,考虑到 执行性能、开发效率、调试效率、可维护性、严谨性 五大要素,最终选用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实战笔录(一)的更多相关文章

  1. 【Quote】What is Mono

    What is Mono Mono is a software platform designed to allow developers to easily create cross platfor ...

  2. Embedding和Word2Vec实战

    在之前的文章中谈到了文本向量化的一些基本原理和概念,本文将介绍Word2Vec的代码实现 https://www.cnblogs.com/dogecheng/p/11470196.html#Word2 ...

  3. 【Xamarin挖墙脚系列:Mono项目的图标为啥叫Mono】

    因为发起人大Boss :Miguel de lcaza 是西班牙人,喜欢猴子.................就跟Hadoop的创始人的闺女喜欢大象一样...................... 历 ...

  4. 在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验

    准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). 不懂Mono的请移步张善友大神的:国内 Mono 相关文章汇总 不懂Jexus为何物 ...

  5. Linux.NET实战手记—自己动手改泥鳅(上)

    各位读者大家好,不知各位读者有否阅读在下的前一个系列<Linux.NET 学习手记>,在前一个系列中,我们从Linux中Mono的编译安装开始,到Jexus服务器的介绍,以及如何在Linu ...

  6. 分享一实战性开源MVC框架<Linux、Windows跨平台开发so easy>

    一.引子   开源地址 https://github.com/564064202/Moon.Mvc 欢迎加入开发 .NET Core微软还在发力,但作为商用还有一段距离,很多开发库尚不能用于.NET ...

  7. 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...

  8. 在 Azure 上使用 Docker运行 Mono

    Docker 是最近相当热门的一个名词,它是一个基于 Linux Container 的轻量化的虚拟技术,而微软也相当积极与 Docker 合作,在 Azure 上支持这个火热的技术,并且提供简单的方 ...

  9. Xamarin Mono For Android 4.6.07004 完整离线安装破解版(C#开发Android、IOS工具)

      Xamarin是由Miguel de Icaza成立的一家新的独立公司,目的是给Mono一个继续奋斗的机会.Mono for Android (原名:MonoDroid)可以让开发人员使用 Mic ...

随机推荐

  1. 结合Jexus + Kestrel 部署 asp.net core 生产环境

    ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依赖. 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: ...

  2. Ajax 概念 分析 举例

    Ajax是结合了访问数据库,数据访问,Jquery 可以做页面局部刷新或者说是页面不刷新,我可以让页面不刷新,仅仅是数据的刷新,没有频繁的刷页面,是现在比较常用的一种方式做页面那么它是怎么实现页面无刷 ...

  3. 移动硬盘不能识别的常见7种解决方案 ~ By 逆天经验

    服务器汇总:http://www.cnblogs.com/dunitian/p/4822808.html#iis 服务器异常: http://www.cnblogs.com/dunitian/p/45 ...

  4. ExtJS 4.2 组件的查找方式

    组件创建了,就有方法找到这些组件.在DOM.Jquery都有各自的方法查找元素/组件,ExtJS也有自己独特的方式查找组件.元素.本次从全局查找.容器内查找.form表单查找.通用组件等4个方面介绍组 ...

  5. .Net Core MVC 网站开发(Ninesky) 2.3、项目架构调整-控制反转和依赖注入的使用

    再次调整项目架构是因为和群友dezhou的一次聊天,我原来的想法是项目尽量做简单点别搞太复杂了,仅使用了DbContext的注入,其他的也没有写接口耦合度很高.和dezhou聊过之后我仔细考虑了一下, ...

  6. mysql 学习总结

    MYSQL的增.删.查.改   注册.授权 #创建一个对数据库中的表有一些操作权限的用户,其中OPERATION可以用all privileges替换,DBNAME.TABLENAME可以用*替换,表 ...

  7. css居中div的几种常用方法

    在开发过程中,很多需求需要我们居中一个div,比如html文档流当中的一块div,比如弹出层内容部分这种脱离了文档流等.不同的情况有不同的居中方式,接下来就分享下一下几种常用的居中方式. 1.text ...

  8. js callee,caller学习

    原文地址:js callee,caller学习 /* * caller 返回一个对函数的引用,该函数调用了当前函数. * 如果函数是由顶层调用的,那么 caller包含的就是 null . * 如果在 ...

  9. C#——传值参数(2)

    //我的C#是跟着猛哥(刘铁猛)(算是我的正式老师)<C#语言入门详解>学习的,微信上猛哥也给我讲解了一些不懂得地方,对于我来说简直是一笔巨额财富,难得良师! 这次与大家共同学习C#中的 ...

  10. android手机登录时遇到“QQ安全登录发现病毒”解决

    android手机作为开源系统非常容易感染病毒,有时候我们会经常遇到手机QQ登录时检测到app被感染,一般情况是由手机感染病毒所引起的,安装腾讯管家后只能检测病毒和卸载感染病毒的软件,不能清除病毒.解 ...