如何利用C生成.so供Mono调用
Mono诞生的初衷是为了吸引更多的Windows .Net程序员来加入Linux平台的开发。但在Linux世界中C语言依然是
主流。很多时候一些关键应用(比如大型 笛卡儿 乘积运算、需要调用平台硬件功能的时候)不得不依赖C来完成。
这个时候 Mono 多少显得有些力不从心。
当然可以使用DLLImport特性来完成对本地库(.so)的调用。现在来讲讲如何生成自己的本地库,并在Mono中调用
首先,先用 C 写一个简单的函数,这个函数只用来把2个整形的形参相加之后返回结果。
//the file name is sum.c
#include <stdio.h>
int sum(int a, int b)
{
return a + b;
}
OK.现在我们准备生成一个名为 libsum.so 的目标本地库。使用 GCC 编译器来编译生成我们要的结果
gcc -Wall -fPIC -O2 -c -o libsum.o sum.c //生成.o
gcc -shared -Wl,-soname,libsum.so -o libsum.so libsum.o //这步才生成共享库 .so 文件
这个时候已经生成 libsum.so。然后可以在 Mono 中使用它了。
using System;
using System.Runtime.InteropServices;
public class UnsafeDemo
{
[DllImport ("libsum.so", EntryPoint="sum")]//一定要指定EntryPoint
static extern int sum(int a, int b);
unsafe static void Main()
{
int x = sum(23, 45);
Console.WriteLine("x: {0}", x);
}
}
之后可以编译我们的程序:
$ mcs --unsafe UnsafeDemo.cs
$ mono UnsafeDemo.exe
如果在编译程序的时候提示没找到 libsum.so ,你可以把 libsum.so 放到与 UnsafeDemo.exe 同级的目录下面试试。
如果还不成功也可以参照我的这篇文章, good luck!
http://blog.csdn.net/zhangjianying/archive/2006/09/04/1177049.aspx
最后提醒一点写 C 的时候记住一点。C 是用返回值来判断是否发生错误。而 Mono 是用异常。
//C code segment
int debug (char *s)
{
printf("Output: %s/n", s);
return -1;
}
//mono code segment
[DllImport ("libsum.so", EntryPoint="debug")]
static extern int debug(string sb);
unsafe static void Main()
{
int x = debug("hello");
if (x)
{
// succeeded
}
else
{
// failed
throw new YouException();
}
}
如何利用C生成.so供Mono调用的更多相关文章
- java生成jar并用ikvm生成dll供C#调用
最近想尝试用C#做NB_IOT北向API接口的访问.北向API的接口的访问需要证书的双向认证,而C#不支持双向认证,所以就使用IKVM在C#中跑JAVA程序实现HTTPS请求部分. 步骤如下: 一.使 ...
- Matlab生成动态链接库供C#调用
1.首先在Matlab中编写一个或几个.m文件 2.然后在命令空间中输入命令:deploytool 3.修改工程名称,修改需要生成文件后缀 4.添加类,添加文件,然后点击生成.
- c++ 生成dll文件并调用-转
.h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分 .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll, ...
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)
Eclipse.MinGW.JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法) 问题背景:之前的JNI编程都是基于And ...
- 编译可供C#调用的C/C++动态链接库dll文件
编译可供C#调用的C/C++动态链接库dll文件,C语言控制台应用程序,探索生成dll过程 由于项目需求,需要公司另一个团队提供相关算法支持,是用C语言编译好的dll库提供给我们进行调用. 但是拿到d ...
- (Unity)Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进展混淆,避免被反编译
Unity自定义Debug日志文件,利用VS生成Dll文件并使用Dotfuscated进行混淆,避免被反编译. 1.打开VS,博主所用版本是Visual Studio 2013. 2.新建一个VC项目 ...
- JSP利用freemarker生成基于word模板的word文档
利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...
- 用IKVMC将jar转成dll供c#调用
用IKVMC将jar转成dll供c#调用 ikvmc c# dll jar 用IKVMC将jar转成dll供c#调用 前言 ikvmc介绍 ikvmc下载安装 下载并解压 设置环境变量 jar-> ...
随机推荐
- Redis与MySQL的结合
Redis与MySQL的结合 目前大部分互联网公司使用MySQL作为数据的主要持久化存储,那么如何让Redis与MySQL很好的结合在一起呢?我们主要使用了一种基于MySQL作为主库,Redis作为高 ...
- hdu1715(Java)大数相加
大菲波数 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissio ...
- hdu1002大数相加
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- javaHDU1003Max Sum
import java.util.Scanner; public class Sum {public static void main(String args[]) {Scanner cin=n ...
- css :after和:before
:before是css中的一种伪元素,可用于在某个元素之前插入某些内容.:after是css中的一种伪元素,可用于在某个元素之后插入某些内容. 举例: 1.结合border写个对话框的样式. < ...
- Linux性能实时监测工具netdata安装配置
netdata:功能强大的实时性能检测工具,展示地址. github地址:https://github.com/firehol/netdata 本文介绍在CentOS 6.7下安装netdata 1. ...
- 通过配置tomcat虚拟路径配置站点的静态资源
我们常常站点中会提供给用户上传文件.图片.视频或者诸如为了提高性能生成的静态文件等存储在站点应用中.但如果静态资源文件和项目文件在同一个目录下,当我们重新部署文件时,war重新解压会导致静态资源文件的 ...
- Redis操作List工具类封装,Java Redis List命令封装
Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...
- 闲话:你今天OO了吗?
如果你的分析习惯是在调研技术的时候最先弄清楚有多少业务流程,先画出业务流程图,然后顺藤摸瓜,找出业务流程中每一步骤的参与部门或岗位,弄清楚在这一步参与者所做的事情和填写表单的结果,并关心用户是如何把这 ...
- hibernate篇章二--成就搭建hibernate框架
在网上的资料很多,但是成功搭建一个Hibernate框架的很少,下面我将用一个简单的例子成功搭建一个Hibernate框架给大伙瞧瞧 该链接中有源代码和数据库,例子很简单,只是往数据库中的person ...