`

[科普小短文]在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  

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

 

 

相关链接:

分享到:
评论

相关推荐

    小学数学测试系统(c语言)

    C语言在以其目标代码质量高,使用灵活,数据类型丰富,可移植性好等特点而得到广泛的普及和迅速发展,成为一种在系统软件开发、科学计算、自动控制等各个领域广泛应用的程序设计语言。在众多高级程序设计语言竞显...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    8.4.3 被调用函数的声明和函数原型 107 8.5 函数的嵌套调用 108 8.6 函数的递归调用 109 8.7 数组作为函数参数 110 8.8 局部变量和全局变量 112 8.8.1 局部变量 113 8.8.2 全局变量 119 8.9 变量的存储类别 120 78.9...

    C语言写的世界程序大赛获奖作品

    C语言写的世界程序大赛获奖作品。。很震撼

    试论C语言在高校计算机专业课程中的意义.doc

    试论C语言在高校计算机专业课程中的意义 摘要:c语言是高校计算机相关专业的基础课程之一,是计算机专业学生必须具备的 基本技能之一。c语言功能强大、应用广泛,在计算机相关科技领域中不断发展,渐趋完 善。本文...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    8.4.3 被调用函数的声明和函数原型 107 8.5 函数的嵌套调用 108 8.6 函数的递归调用 109 8.7 数组作为函数参数 110 8.8 局部变量和全局变量 112 8.8.1 局部变量 113 8.8.2 全局变量 119 8.9 变量的存储类别 120 78.9...

    水仙花数c语言程序水仙花数c语言程序

    在 C语言中,可以通过循环和条件判断等基本语句,来实现水仙花数的求解。 下面是一个简单的 C语言程序,用于求解三位数中的水仙花数: #include int main() { int num, digit, sum; printf("Three-digit ...

    C语言 课件

    物联网与互联网一字之差,“差”在哪里?不同的专家学者对这个“差”有不同的理解,有共识也有争论。本书讨论了物联网的起源与发展、核心技术、主要特点以及应用前景,为读者勾画出一个具有鲜明特征的物联网时代。...

    C#课程设计大作业基于C#的学生社团管理系统源码+数据库.zip

    随着计算机技术的飞速发展,计算机在企业、高校等管理中应用的普及,利用计算机实现高效、智能的管理势在必行。对于知识创新的主体,高校教育来说,更应该着重实际,从身边做起,利用高科技解决实际问题,适应现代...

    C语言课件 输入输出

    物联网与互联网一字之差,“差”在哪里?不同的专家学者对这个“差”有不同的理解,有共识也有争论。本书讨论了物联网的起源与发展、核心技术、主要特点以及应用前景,为读者勾画出一个具有鲜明特征的物联网时代。...

    物理实验数据处理系统 C语言源代码

    学了物理实验&gt;&gt;的人都知道,物理实验最麻烦的是数据处理,现在都是信息时代了,那种含有十几位小数的数据居然还要用手来一个个地算,真是太对起自己了,以下这个程序可以算平均值,残差,标准偏差,和总不确定度,...

    Word Wind (c#)最新版本

    World Wind(简称WW,中文民间直译为世界风),是NASA发布的一个开放源代码(Open Source)的地理科普软件(由NASA Research开发,由NASA Learning Technologies来发展),它是一个可视化地球仪,将NASA、USGS以及其它WMS...

    详解python函数传参是传值还是传引用

    函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。 值传递(passl-by-value)过程中,被调函数的形式参数作为被...

    七年级语文科普短文两篇PPT教案.pptx

    七年级语文科普短文两篇PPT教案.pptx

    基于Linux 的防火墙技术研究

    OUT 根据OUTPUT 链(在filter 表中)中的规则对数据包进行检查,如果规则匹配,则回调函数按规则所 指定的动作来处理该包,否则丢弃该包。 2.2 Netfilter 内核框架 Netfilter 是Linux2.4.x 内核中用于包处理的抽象、通用...

    C语言课件 内存

    物联网与互联网一字之差,“差”在哪里?不同的专家学者对这个“差”有不同的理解,有共识也有争论。本书讨论了物联网的起源与发展、核心技术、主要特点以及应用前景,为读者勾画出一个具有鲜明特征的物联网时代。...

    Linux讲义.rar

    一些Linux的入门基础科普 终端命令格式 Ubuntu 图形界面入门 操作系统科普章节 虚拟机 操作系统的发展史 Linux 内核及发行版 Linux 的应用常用 Linux 命令的基本使用 其他命令 文件和目录文件和目录常用命令 系统...

    谭浩强C语言+第三版课后答案.doc

    他于90年代初在央视1套系统向全国介绍了C、C++、JAVA等7种计算机语言,并同时让计算机科学走进寻常百姓家。他也是享受政府特殊津贴专家,北京市有突出贡献专家,全国高校计算机基础教育研究会会长。曾任清华大学绵阳...

    给小学生科普人工智能.pptx

    人类历史上的信息革命 第一次 信息革命 第二次 信息革命 第三次 信息革命 第四次 信息革命 第五次 信息革命 第六次 信息革命 语言的创造 猿 人 信息得以交流和传递 文字的出现 信息可以被储存在文字中进行传播,...

    计算机程序设计的要点与规范分析-.docx

    在计算机程序设计时,把需要调用的函数存放于内存中,然后把用于函数调用指令的地址保存在堆栈,通过这种方式,在之后的程序设计时可以通过堆栈中的函数调用指令,从而完成函数的调用。 2.3 掌握C语言的自增和自减...

Global site tag (gtag.js) - Google Analytics