zoukankan      html  css  js  c++  java
  • 如何利用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();
                    }
            }

  • 相关阅读:
    goreplay~基本知识
    goreplay~http输出队列
    goreplay~拦截器设置
    goreplay~流量变速
    goreplay~http过滤参数
    goreplay~文件输出解析
    goreplay~http输出工作线程
    Antlr4 语法解析器(下)
    2021最新版Eclipse的下载和使用
    MySQL中drop、truncate和delete的区别
  • 原文地址:https://www.cnblogs.com/flish/p/4775570.html
Copyright © 2011-2022 走看看