之前写过一篇小短文:《[科普小短文]在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行代码:
// -----------------------------------------------------------------------
// <copyright file="Invoke.cs" company="Yaping Xin">
// P/Invoke example.
// </copyright>
// -----------------------------------------------------------------------
namespace Invoke
{
using System;
using System.Runtime.InteropServices;
/// <summary>
/// .Net P/Invoke example.
/// </summary>
internal class Program
{
/// <summary>
/// Entry point of the application.
/// </summary>
/// <param name="args">Console arguments.</param>
internal static void Main(string[] args)
{
int result = Sum(2, 3);
Console.WriteLine("Shared library func execute result: {0}", result);
}
/// <summary>
/// Call method int sum(int, int) defined in Test.dll
/// </summary>
/// <param name="a">parameter a</param>
/// <param name="b">parameter b</param>
/// <returns>sum of a and b</returns>
[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