永发信息网

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

答案:1  悬赏:0  手机版
解决时间 2021-01-25 04:17
  • 提问者网友:遮云壑
  • 2021-01-24 22:56
如何利用C生成.so供Mono调用
最佳答案
  • 五星知识达人网友:你可爱的野爹
  • 2021-01-25 00:26
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();
  }
  }
  转载
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯