[科普小短文]在C#中调用C语言函数(静态调用Native DLL,Linux & Mono平台)

之前写过一篇小短文:《[科普小短文]在C#中调用C语言函数》,是在Windows平台下基于Microsoft.Net的一个例子。今天我们来做另外一个小例子,是在Linux平台下基于Mono的例子。关于在C#中调用C语言函数的具体技术P/Invoke,在之前那篇文章《[科普小短文]在C#中调用C语言函数》中有介绍,不了解的读者可以去看一下,这里不多介绍了,直接来看我们的例子。


一、准备动态链接库

C语言源代码:Test.c 和我们之前那个Windows平台的代码是一致的:

int sum(int a, int b)  
{  
    return a + b;  
}

我们用gcc来把它编译成动态链接库 libtest.so

gcc -c -Wall -Werror -fpic Test.c
gcc -shared -o libtest.so Test.o

这样我们就得到了 libtest.so 这个动态链接库。

无图无真相,我们看一下截图:



二、在C#中通过P/Invoke调用Test.dll中的sum()方法

我们用 vi 来编写一个简单的C#程序:Invoke.cs

这个C#程序除去注释、除去namespace定义、引用之外,只有6行代码:

// -----------------------------------------------------------------------  
//   
// P/Invoke example.  
//   
// -----------------------------------------------------------------------
namespace Invoke  
{  
    using System;  
    using System.Runtime.InteropServices;  
  
    ///   
    /// .Net P/Invoke example.  
    ///   
    internal class Program  
    {  
        ///   
        /// Entry point of the application.  
        ///   
        /// Console arguments.  
        internal static void Main(string[] args)  
        {  
            int result = Sum(2, 3);  
            Console.WriteLine("Shared library func execute result: {0}", result);  
        }  
  
        ///   
        /// Call method int sum(int, int) defined in Test.dll  
        ///   
        /// parameter a  
        /// parameter b  
        /// sum of a and b  
        [DllImport("libtest.so", EntryPoint = "sum")]  
        private static extern int Sum(int a, int b);  
    }  
}

在命令行下编译该C#源文件:

gmcs Invoke.cs

这样就编译出了一个基于mono的可执行文件 Invoke.exe



三、执行

我们把 libtest.so 拷贝到 /lib 目录下,以便我们的程序能找到它。为什么放到这个目录下呢?这是根据Linux操作系统搜寻动态链接库的规则来做的,对此问题如果希望详细解释的话,请阅读有关Linux系统的文档、手册。

执行我们的C#代码编译得到的可执行文件:

mono Invoke.exe

得到了和《 [科普小短文]在C#中调用C语言函数》一文中一样的执行结果:

Shared library func execute result: 5

无图无真相,我们再来一张截图:




相关链接:

  • Interop with Native Libraries
    http://www.mono-project.com/Interop_with_Native_Libraries
  • 动态库(.so)
    http://linux-wiki.cn/wiki/zh-hans/%E5%8A%A8%E6%80%81%E5%BA%93%28.so%29


你可能感兴趣的:(互操作,Mono,.Net,C,Linux,C#)