如何利用C生成.so供Mono调用
来源:互联网 发布:淘宝开网店保证金 编辑:程序博客网 时间:2024/04/30 05:54
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();
}
}
- 如何利用C生成.so供Mono调用
- 如何利用C生成.so供Mono调用
- 如何利用C生成.so供Mono调用
- 如何调用已有的SO文件来生成供Android使用的SO文件
- 生成so库供Java调用
- Linux下编译安装OpenCV(基于C++,生成so库供python调用)
- C语言生成DLL供C#调用
- c 生成.so 文件及 python 调用.so
- 如何生成供VS2010调用的OpenCV3.0库文件
- C生成DLL供C#或VB调用
- android中用ndk编译c代码为so库,供jni调用(一)
- 利用Java注解将常量类生成js文件供前端调用
- Android_10_java调用C(借助NDK工具自动生成.so)
- Linux C:生成、调用静态库/动态库,.a,.so
- LINUX下PHP生成并调用C的.so文件
- php调用C语言生成的so文件
- C/C++ 生成的.so文件,python 用ctypes调用
- mac下lua调用c生成的so文件
- Extjs 多选和单选下拉框
- oracle创建表空间,创建用户
- 好东西 网址收集
- {转}学图形学都需要什么
- 深入Linux内核网络堆栈
- 如何利用C生成.so供Mono调用
- 未曾被Moblin v2遗忘的Nettop
- submit与button的区别
- Hacking the Linux Kernel Network Stack
- 重置MSSQL的Identity标识列的值
- struts2 国际化与防止刷新重复提交表单
- 强大的.NET反编译工具Reflector及插件!
- 通用C++ typeid实现(不支持RTTI) v0.2
- 【转】HTTP协议头字段及分析