永发信息网

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

答案:1  悬赏:0  手机版
解决时间 2021-01-25 04:17
如何利用C生成.so供Mono调用
最佳答案
Mono诞生的初衷是为了吸引更多的Windows .Net程序员来加入Linux平台的开发。但在Linux世界中C语言依然是
  主流。很多时候一些关键应用(比如大型 笛卡儿 乘积运算、需要调用平台硬件功能的时候)不得不依赖C来完成。
  这个时候 Mono 多少显得有些力不从心。
  当然可以使用DLLImport特性来完成对本地库(.so)的调用。现在来讲讲如何生成自己的本地库,并在Mono中调用
  
  首先,先用 C 写一个简单的函数,这个函数只用来把2个整形的形参相加之后返回结果。
  
  //the file name is sum.c
  #include
  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();
  }
  }
  转载
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
多人同为一桩案件的被告,可以签一份代理协议
【cold weather may keep the flower from bu
赣州哪里有大药房啊?具体位置在哪里?
bilbil弹幕怎么删能删吗
为什么卤鸭多过卤鸡
桂林的文字资料
植物生长需要多种无机盐,期中需要量最多的三
120年前,中国发生了一件大事是什么
设Y=ax的5次方+bx的3次方+cx-5
I don't want
粽子叶正面还是反面包包
企业所得税年度纳税申报表每页经办人(签章)直
邮政快递显示已经到济宁,这样该去哪里取件啊
哪种热带鱼好看又好养?
岭头亭这个地址在什么地方,我要处理点事
推荐资讯
华为手机自动删除空白桌面是怎么回事?
直径47J6的孔,公差值是多少
骏业雅苑停车场怎么去啊,我要去那办事
领军教育(宝鸡眉县校区)怎么去啊,我要去那办
服部在柯南剧场版中出现过的是哪几集 一定要
送什么给班长做为生日礼物好
为增强建设美丽中国的责任感,某校九二班开展
稻香村是北京的特产还是河北的特产?
双七作五六是什么意思
具有POE供电的交换机,如何选择端口防雷器(
水果店运来橘子340千克,比运来苹果的3倍少80
家馨窗帘布艺地址在什么地方,我要处理点事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?