如何利用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();
}
}