如何利用C生成.so供Mono调用

 Mono诞生的初衷是为了吸引更多的Windows .Net程序员来加入Linux平台的开发。但在Linux世界中C语言依然是
 主流。很多时候一些关键应用(比如大型 笛卡儿 乘积运算、需要调用平台硬件功能的时候)不得不依赖C来完成。
 这个时候 Mono 多少显得有些力不从心。
 当然可以使用DLLImport特性来完成对本地库(.so)的调用。现在来讲讲如何生成自己的本地库,并在Mono中调用
 
 首先,先用 C 写一个简单的函数,这个函数只用来把2个整形的形参相加之后返回结果。
 
 //the file name is sum.c
 #include <stdio.h>
int sum(int a, int b)
{
        return a + b;
}

 OK.现在我们准备生成一个名为 libsum.so 的目标本地库。使用 GCC 编译器来编译生成我们要的结果
 gcc -Wall -fPIC -O2 -c -o libsum.o sum.c //生成.o
 gcc -shared -Wl,-soname,libsum.so -o libsum.so libsum.o //这步才生成共享库 .so 文件
 这个时候已经生成 libsum.so。然后可以在 Mono 中使用它了。
 
using System;
using System.Runtime.InteropServices;

public class UnsafeDemo
{
        [DllImport ("libsum.so", EntryPoint="sum")]//一定要指定EntryPoint
        static extern int sum(int a, int b);

        unsafe static void Main()
        {
                int x = sum(23, 45);
                Console.WriteLine("x: {0}", x);
        }
}

之后可以编译我们的程序:
$ mcs --unsafe UnsafeDemo.cs
$ mono UnsafeDemo.exe

如果在编译程序的时候提示没找到 libsum.so ,你可以把 libsum.so 放到与 UnsafeDemo.exe 同级的目录下面试试。
如果还不成功也可以参照我的这篇文章, good luck!
http://blog.csdn.net/zhangjianying/archive/2006/09/04/1177049.aspx

最后提醒一点写 C 的时候记住一点。C 是用返回值来判断是否发生错误。而 Mono 是用异常。

//C code segment
int debug (char *s)
{
        printf("Output: %s/n", s);
        return -1;       
}

//mono code segment
[DllImport ("libsum.so", EntryPoint="debug")]
        static extern int debug(string sb);

        unsafe static void Main()
        {
                int x = debug("hello");
               
                if (x)
                {
                 // succeeded
                }
                else
                {
                 // failed
                 throw new YouException();
                }
        }

 
 

  

时间: 2024-09-23 18:04:36

如何利用C生成.so供Mono调用的相关文章

Matlab生成动态链接库供C#调用

原文http://www.cnblogs.com/chenyongblog/p/3156716.html 1.首先在Matlab中编写一个或几个.m文件 2.然后在命令空间中输入命令:deploytool 3.修改工程名称,修改需要生成文件后缀 4.添加类,添加文件,然后点击生成.   作者:陈勇

使用javascriptcore实现供h5调用的native接口

在app开发中使用webview,经常需要从js端调用和原生相关的交互功能.那么这样一层bridge的开发工作具体采用什么方案来实现呢? JS call OC: 方案1: 最古老也是使用最广泛.且跨平台的方案是在页面内嵌入一个iframe,然后通过该iframe触发的webview相关事件来进行hook,从而达到通信的目的. 其中回调方法的传递是通过生成一个id并保存,来回传递id,在js端再通过id获取到对应的fuction实现回调.大名鼎鼎的cordova就是采用了这种方案实现了bridge

利用JS生成博文目录及CSS定制博客_javascript技巧

本文实例为大家介绍了利用JS生成博文目录及CSS定制博客的方法,分享给大家供大家参考,具体内容如下 1.JS代码 想要生成目录,许多都说需要JS修改权限,那个这里就直接进入设置页面,找到下方的联系邮箱直接发去就行了,工作人员回复的还是很快的. 拿到权限之后,下面就是将编(搜)写(寻)的JS代码放在页脚HTML代码的方框内,然后点击保存就可以了.要注意目录的生成是几级标题,这一点可是很重要的.JS代码如下,基本没有变化,拷贝了原作者的写法,可以生成二级目录,分别为h2和h3,这点需要注意. 综合来

php利用phpexcel生成excel文档实例

php教程 利用phpexcel生成excel文档实例 //ini_set("display_errors",1);//是否显示报错信息 //ini_set('include_path', ini_get('include_path').'; require_once("./1.7.2/Classes/PHPExcel.php"); require_once("./1.7.2/Classes/PHPExcel/Writer/Excel5.php"

php利用flashchart生成柱状图

php教程利用flashchart生成柱状图 最近项目中需要生成类似excel的柱状图.饼图.趋势图等等... 网上google了一番,发现了 Open Flash Chart   地址:  http://teethgrinder.co.uk/open-flash-chart-2/ . 非常好用的一款开源工具.目前最新版是2.0 --------------------------– http://ofcgwt.googlecode.com/svn/demo/Demo.html 这里有很多示例可

Excel怎么利用公式生成九九乘法表?

  Excel怎么利用公式生成九九乘法表?         建立一个工作表Sheet1(如图1),并在A3~A11单元格依次输入1~9,B2~J2单元格依次输入1~9. 图1 计算结果 "九九乘法表"中的数值结果都是行值乘以列值而得到的,所以Excel单元格中的数值也应为行值乘以列值,如D6的值为A6乘以D2的结果,其公式为:"=A6*D2". 单元格输出格式 因为"九九乘法表"的格式是"4×3=12"的形式(如图2),所以在

利用php生成word文档

  利用php生成word文档,生成的word文件可以用word,wps等软件打开.具体代码如下: function word($data,$fileName=""){ if(empty($data)) return ""; $data="".$data.""; if(empty($fileName)) $fileName=date("YmdHis").".doc"; $fp=fopen

PHP利用imagick生成组合缩略图_php实例

先给大家炫下效果图,如果大家觉得还很满意,请继续往下阅读: 这里说的imagick 是 ImageMagick 在PHP下的扩展.使用pecl安装起来那叫一个轻松简单一条命令就搞定: 复制代码 代码如下: sudo pecl install imagick (扩展装好后还是要在php.ini中加上extension=imagick.so,然后记得重启apache或php-fpm服务.) 最近有个需求是要把多张图片组合起来生成缩略图,刚好用用这个强大的imagick扩展. 这个需求是要这样生成缩略

hibernate配置-使用注解生成的uuid.hex 调用save()保存对象不发语句也不报错

问题描述 使用注解生成的uuid.hex 调用save()保存对象不发语句也不报错 @Id @GenericGenerator(name=""systemUUID""strategy=""uuid"") @GeneratedValue(generator=""systemUUID"") @Column(name = ""ID"" unique =