http://blog.csdn.net/xinyaping/article/details/7672171
前写过一篇小短文:《[科普小短文]在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