[科普小短文]在C#中调用C语言函数 (Linux & Mono版) 转

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平台的代码是一致的:

  1. int  sum( int  a,  int  b)    
  2. {    
  3.     return  a + b;    
  4. }  


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

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


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

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

 

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

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

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

[csharp] view plain copy print ?
  1. // -----------------------------------------------------------------------     
  2. // <copyright file="Invoke.cs" company="Yaping Xin">     
  3. // P/Invoke example.     
  4. // </copyright>     
  5. // -----------------------------------------------------------------------   
  6. namespace  Invoke    
  7. {    
  8.     using  System;    
  9.     using  System.Runtime.InteropServices;    
  10.     
  11.     /// <summary>     
  12.     /// .Net P/Invoke example.     
  13.     /// </summary>     
  14.     internal   class  Program    
  15.     {    
  16.         /// <summary>     
  17.         /// Entry point of the application.     
  18.         /// </summary>     
  19.         /// <param name="args">Console arguments.</param>     
  20.         internal   static   void  Main( string [] args)    
  21.         {    
  22.             int  result = Sum(2, 3);    
  23.             Console.WriteLine("Shared library func execute result: {0}" , result);    
  24.         }    
  25.     
  26.         /// <summary>     
  27.         /// Call method int sum(int, int) defined in Test.dll     
  28.         /// </summary>     
  29.         /// <param name="a">parameter a</param>     
  30.         /// <param name="b">parameter b</param>     
  31.         /// <returns>sum of a and b</returns>     
  32.         [DllImport("libtest.so" , EntryPoint =  "sum" )]    
  33.         private   static   extern   int  Sum( int  a,  int  b);    
  34.     }    
  35. }  

 

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

  1. gmcs Invoke.cs  


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

 

 

三、执行

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

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

  1. mono Invoke.exe  


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

  1. Shared library func execute result: 5  

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

 

 

相关链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值