LINUX DOTNET      Linux DotNET 中文社区

Linux .NET编程与应用技术之专业网站:www.linuxdot.net !     返回首页    
   
[楼主] 如何利用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 同级的目录下面试试。
最后提醒一点写 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();
                }
        }

作者:匿名   发布时间:08年11月02日   可选操作:删除 回复

 
   
   

留言回复:
标题: * 标题必填
作者:   * 请填上你的名字  
操作键:   * 填入几个字母表示是您写的,便于进一步操作
发言内容:
 
发贴者须知:
1、您无需注册即可发贴,但是,贴子内容必须在法律法规和社会公德所允许的范围内;
2、本站专注IT技术,谢绝包括政治、社会、情感等任何与IT技术无关的贴子在本站发表;
3、本站保留对任何贴子进行删除、禁用、更改、举报、追究等所有权利;
 
今天是: 周六  周一  周二  周三  周四  周五  周七