最近在给自己的服务器节点添加脚本功能,考虑到 执行性能、开发效率、调试效率、可维护性、严谨性 五大要素,最终选用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. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  2. ABP文档 - Mvc 控制器

    文档目录 本节内容: 简介 AbpController基类 本地化 其它 过滤 异常处理和结果包装 审计日志 验证 授权 工作单元 反伪造 模型绑定器 简介 ABP通过nuget包Abp.Web.Mv ...

  3. Java 8五大主要功能为开发者提供了哪些便利?

    两年前当Java 8发布后,立即受到了业界的欢迎,因为它大大提高了Java的性能.它独特的卖点是,顾及了编程语言的每一个方面,包括JVM(Java虚拟机)和编译器,并且改良了其它帮助系统. Java是 ...

  4. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  5. 深究标准IO的缓存

    前言 在最近看了APUE的标准IO部分之后感觉对标准IO的缓存太模糊,没有搞明白,APUE中关于缓存的部分一笔带过,没有深究缓存的实现原理,这样一本被吹上天的书为什么不讲透彻呢?今天早上爬起来赶紧找了 ...

  6. 利用Oracle RUEI+EM12c进行应用的“端到端”性能诊断

    概述 我们知道,影响一个B/S应用性能的因素,粗略地说,有以下几个大的环节: 1. 客户端环节 2. 网络环节(可能包括WAN和LAN) 3. 应用及中间层环节 4. 数据库层环节 能够对各个环节的问 ...

  7. Go web开发初探

    2017年的第一篇博客,也是第一次写博客,写的不好,请各位见谅. 本人之前一直学习java.java web,最近开始学习Go语言,所以也想了解一下Go语言中web的开发方式以及运行机制. 在< ...

  8. 要想提高PHP的编程效率,你必须知道的要点

    1.当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数.此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储 ...

  9. 小兔JS教程(三)-- 彻底攻略JS回调函数

    这一讲来谈谈回调函数. 其实一句话就能概括这个东西: 回调函数就是把一个函数当做参数,传入另一个函数中.传进去的目的仅仅是为了在某个时刻去执行它. 如果不执行,那么你传一个函数进去干嘛呢? 就比如说对 ...

  10. 【Java每日一题】20170106

    20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...