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

http://blog.youkuaiyun.com/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函数的方法: 方法一: 1.新建Visual C++类型的Win32项目C语言的函数定义如下:extern "C" __declspec(dllexport) int fnTestWin32(void);实现如下extern "C" __declspec(dllexport) int fnTestWin32(void){ return 42;}工 阅读详情

相关推荐

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

之前写过一篇小短文:《[科普小短文]在C#中调用C语言函数》,是在Windows平台下基于Microsoft.Net的一个例子。今天我们来做另外一个小例子,是在Linux平台下基于Mono的例子。关于在C#中调用C语言函数的具体技术P/Invoke,在之前那篇文章《[科普小短文]在C#中调用C语言函数》中有介绍,不了解的读者可以去看一下,这里不多介绍了,直接来看我们的例子。 一、准备动态

辛亚平的专栏 8219

C#中调用C源代码 SM4

sm4 c 源代码 /* * SM4/SMS4 algorithm test programme * 2012-4-21 */ #include #include //#include "sm4.h" #include "time.h" /* * SM4 Encryption alogrithm (SMS4 algorithm) * GM/T 0002-2012 Chines

byrgtclaire的专栏 5222

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

本文属于“科普”性质,面向对.Net不了解的读者。   对于不太了解.Net的人,如果想要了解.Net,我必须给他介绍P/Invoke。P/Invoke是什么呢?简单地说,就是在.Net中调用本地代码(Native code)的一种解决方案。所谓“本地代码”是相对于托管代码(Managed code)来说的。 P/Invoke实在是一个非常棒(awesome)的特性。本来,.Net 这项技术...

辛亚平的专栏 2万+

C#实现调用C语言的三种方法(附完整源码)

C#实现调用C语言的三种方法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1441

穿越编程边界:C#巧借COM Interop与Native Library Interop,解锁异构世界无限潜能

在C#开发中,面对已有的COM组件或原生(native)库,我们常常需要利用COM Interop与Interop with Native Libraries技术来实现跨语言、跨平台的交互。本文将详细介绍这两项关键技术的原理、使用场景,并通过代码示例与注释,展现如何在C#中高效、安全地调用非托管资源。COM Interop是C#与COM组件间通信的桥梁,它使得C#程序能够无缝调用COM组件的功能,同时允许COM组件调用托管(managed)代码。类来处理C字符串到托管字符串的转换,并手动释放非托管内存。

java专栏 954

在C#中如何调用C语言代码

在C#中如何调用C语言代码大概一个月以前,一哥们问我如何将做好的程序生成动态链接库,他是想用C#中调用C 写的代码,他嫌MFC做界面太麻烦,想用C#来做界面。我对动态链接库不了解,回复到不会。在这段日子里一直回想这件事,猜想如果要做C#中调用C语言代码,可以需要做如下两个方面的内容,第一是将C语言编译形成程序集,在C#中引用;第二是有接口可以访问。当然以上内容纯属我的猜测,没任何依据,如果有人使用

stay hungry stay foolish 9115

C#调用C程序的完整实现与实战详解

在现代软件开发中,C#作为.NET平台的主流语言,具备高效的开发效率与强大的运行时支持,而C语言则在系统级编程、嵌入式开发和高性能计算领域占据不可替代的地位。通过C#调用C语言编写的DLL,开发者能够复用大量成熟的底层库,实现性能关键模块的加速或硬件接口的封装。DLL本质上是一个包含导出函数、变量和资源的二进制映像文件,扩展名为.dll。它由编译器将源代码编译为对象文件后,再通过链接器打包生成。

weixin_42453228的博客 1048

C语言调用C#代码的新方式-DllExport

那就是直接使用Native AOT函数导出的方式,其它语言(C++、Go、Java各种支持调用导出函数的语言)就可以直接调用C#导出的函数来使用C#库。在以前,如果有其他语言需要调用C#编写的库,那基本上只有通过各种RPC的方式(HTTP、GRPC)或者引入一层C++代理层的方式来调用。文件,查看函数导出是否成功,如下图所示,我们成功的把ADD方法导出了,另外那个是默认导出用于Debugger的方法,我们可以忽略。.为我们的项目加入Native AOT的支持,根据.NET的版本不同有不同的方式。

qq_30031349的博客 1057

opencv实现“找茬”

// 111.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include using namespace std; #define CVX_RED CV_RGB(0xff,0x00,0x00) #define CVX_BLUE CV_RGB(0x00,0x00,0xff)//定义宏,轮廓边框颜色 in

yanHa007的专栏 2094

ATAC-seq差异分析实战:从原始数据到GO富集(R/Bioconductor全流程)

本文提供了ATAC-seq差异分析的完整R/Bioconductor实战流程,涵盖从原始数据准备、一致峰集构建、计数矩阵生成,到使用DESeq2进行差异可及性分析,以及差异峰的基因组注释与GO富集分析。文章详细讲解了关键步骤、参数设置和常见问题,旨在帮助研究者获得可靠且可解释的生物学结果。

weixin_29246195的博客 228

c#调用c语言的自定义函数,[转]在C#中调用C语言函数(静态调用Native DLL,Windows & Microsoft.Net平台)...

对于不太了解.Net的人,如果想要了解.Net,我必须给他介绍P/Invoke。P/Invoke是什么呢?简单地说,就是在.Net中调用本地代码(Native code)的一种解决方案。所谓“本地代码”是相对于托管代码(Managed code)来说的。P/Invoke实在是一个非常棒(awesome)的特性。本来,.Net 这项技术充分印证了托管程序(Managed program)的种种好处,...

weixin_42187923的博客 688

小红书图文AI创作:输入主题,一键生成图文(coze工作流教程+获取)

输入主题,工作流一键生成小红书风格图文,30s一条,可批量生成

2301_79384090的博客 2798

Simple WPF: C#调用C/C++动态链接库中的函数

本文记录了如何从.NET下调用原生的C语言编译生成的动态链接库函数。文中涵盖了常见的各种函数原型调用。 代码可以从以下仓库找到,希望可以帮到有需要的人 Github: https://github.com/mrchipset/simple-wpf

Mr.Chip的博客 1434

ANSYS APDL学习(6):ANSYS APDL部分命令流介绍

介绍APDL 部分命令流

娱乐至上的博客 1万+

【Bug已解决】Request timed out / API Timeout — Claude Code 请求超时解决方案

方案适用场景推荐指数难度方案一:增加超时大任务处理⭐⭐⭐⭐⭐低方案二:切换 SonnetOpus 太慢⭐⭐⭐⭐⭐低方案三:缩小范围大代码库⭐⭐⭐⭐⭐低方案四:优化网络网络延迟高⭐⭐⭐⭐中方案五:减少 MCPMCP 超时⭐⭐⭐中方案六:流式响应长生成任务⭐⭐⭐低根本原因:请求超时最常见原因是请求体过大(35%)和 Opus 模型推理慢(25%),默认 60 秒超时阈值对大型任务不够最佳实践。

一键难忘的博客 5161

.net开发实践: C#如何调用C/C++库

.net开发实践: C#如何调用C/C++库.net开发实践: C#如何调用C/C++库开发环境C/C++动态库安装插件配置工程编译生成C#工程小结 .net开发实践: C#如何调用C/C++库 最近工作需要研究下C#能否调用已经存的C/C++库,为此写了个小demo总结分享一下,供大家参考 开发环境 Windows平台: Visual Studio 2019 Visual Studio Code .NET SDK 6 C/C++动态库 安装插件 vscode安装CMake Tools &amp; C/

qq_30773619的博客 4189

性能调优秘籍——让OpenClaw运行速度提升10倍(2026优化版)

OpenClaw性能优化核心摘要 本文详细介绍了提升OpenClaw系统性能的关键技术,包括: 使用性能分析器进行代码级性能诊断 内存优化与高效缓存策略 并发处理优化技术 数据库查询性能提升方法 重点内容包括: 全面的性能分析工具实现(计时、内存监控、错误跟踪) 自动生成性能报告和优化建议 操作耗时与内存占用分析算法 关键性能指标(平均耗时、内存增长)计算 通过系统性的性能分析优化,可使OpenClaw运行速度提升10倍以上。

博客 899

C#调用C/C++

C#调用C/C++前言DLL的生成C#控制台调用DLL以及平台问题遇到的一些坑 前言 &nbsp;&nbsp;&nbsp;&nbsp;最近做课程实践,用C#做可视化,C/C++来完成功能实现部分,记录下调用的简单步骤和一些坑。 DLL的生成 &nbsp;&nbsp;&nbsp;&nbsp;要使C/C++的代码能在C#中执行,需要先将C/C++的代码文件生成DLL文件,具体操作: &nbsp;&nbsp;&nbsp;&nbsp;通过VS2019创建C++下的动态链接库项目 &nbsp;&nbsp;&nbsp

Mr_L_K的博客 4142

勇攀数字高峰

摘要:该题目要求在数字地形图中寻找从最低点到最高点的所有严格递增登山路径。采用DFS深度优先搜索结合回溯算法,通过标记已访问位置并检查高度差限制(0&lt;diff≤maxDiff)来遍历所有可能路径。算法首先确定起点(最低点)和终点(最高点),然后进行DFS搜索,每步移动需满足四个方向的合法移动且高度严格递增。最终输出符合条件的路径总数。提供了C++、Java和Python三种实现方案。

面试高手的博客 621

RAGFlow体验大提升:使用GPU加速

场景:在正常部署过程中,启动RAGFlow会用到docker-compose.yml文件来启动。但是在实际使用过程中,会发现RAGFlow极其的卡和笨重,给一一种很不好的用户体验,有没有一种可以让RAGFlow加速的呢?进入RAGFlow的docker目录下会有发现有很多docker的配置文件。方法一:选择docker-compose-gpu.yml这个来启动项目。两个方法选其一 ,就会让你的RAGFlow的使用起来非常的丝滑!方法二:在docker-compose.yml末尾加上。

Ven%的博客 3156

C#与C/C++交互(1)——需要了解的基础知识

C#中用于实现调用C/C++的方案是P/Invoke(Platform Invoke),让托管代码可以调用库中的函数。类似的功能,JAVA中叫JNI,Python中叫Ctypes。调用过程为查找dll,例子中为Test.dll'将该dll加载到内存中查找函数在内存中的地址,例子为查找Load函数,并将其参数按照函数的调用约定压栈,例子中调用约定为Cdecl将控制权转移给非托管函数。

enternalstar的博客 2127

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

教你快速在c#中调用C++代码(函数)

之前写过一段C++的代码,想给他用C#写个界面,也就是想让这段代码在C#中可以运行。看了百度的很多方法,都说是封装成dll调用,但是按照步骤来总会出现各种错误,像以下的这种: 并且迟迟不能解决,今天竟然有人跟我说直接把dll提取到C#工程的bin文件下就可以了,三观都毁了....尝试了一下,真的成功了,在这里把具体步骤和大家说一下,避免 在这种问题上浪费大量的时间。 首先,我们随便建立一

NK_test的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C#中调用C(C++)类的DLL

在C#中调用C(C++)类的DLL的时候,有时候C的接口函数包含很多参数,而且有的时候这些参数有可能是个结构体,而且有可能是结构体指针,那么在C#到底该如何安全的调用这样的DLL接口函数呢?本文将详细介绍如何调用各种参数的方法。

xhreaishengming的专栏 795

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++/CLI(二)Mono C++/CLI Native调用和P/Invoke调用

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

weixin_33736048的博客 4601

C#调用C++

结构体的数据成员,第一个成员的偏移量为0,后面的每个数据成员存储的起始位置要从自己大小的整数倍开始。** 不要将C#中托管堆上的数据,按照传引用的方式传递到C++中 ****不要将C#中托管堆上的数据,按照传引用的方式传递到C++中 ****不要将C#中托管堆上的数据,按照传引用的方式传递到C++中 ****不要将C#中托管堆上的数据,按照传引用的方式传递到C++中 ****不要将C#中托管堆上的数据,按照传引用的方式传递到C++中 ****不要将C#中托管堆上的数据,按照传引用的方式传递到C++中 **

qq_27663383的博客 2367
上一篇: 在 Visual Studio 2012 中创建 ASP.Net Web Service 转
下一篇: 在Visual Studio 2010中使用Visual Leak Detector
superweb
博客等级 码龄20年 0粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值