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

47 篇文章 0 订阅
14 篇文章 0 订阅

之前写过一篇小短文:《[科普小短文]在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

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




相关链接:


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值