C/C++ 与 C#混合编程
C++ 中声明:
extern "C" __declspec(dllexport) int __stdcall testfunc(char* astr,int* a);
extern ”C”
通常来说,C++编译器可能会改变函数和变量的名字,从而导致严重的链接程序问题。例如,假设使用C++编写一个DLL,当创建DLL
时,Microsoft的编译器就会改变函数的名字。函数名将被设置一个前导下划线,再加上一个@符号的前缀,后随一个数字,表示作为参数传递给函数的字
节数。例如,下面的函数是作为DLL的输出节中的_MyFunc@8输出的:
__declspec(dllexport) LONG __stdcall MyFunc(int a, int b);
如果用另一个供应商的工具创建了一个可执行模块,它将设法链接到一个名叫MyFunc的函数,该函数在Microsoft编译器已有的DLL中并不存在,因此链接将失败。 使用extern “C”关键字可以使编译器按照C语言的方式编译DLL文件,即编译时不改变函数名。 __declspec(dllexport) 在 32 位编译器版本中,可以使用__declspec(dllexport) 关键字从DLL导出数据、函数、类或类成员函数。__declspec(dllexport) 会将导出指令添加到对象文件中,因此不需要使用.def文件。 若要导出函数,__declspec(dllexport) 关键字必须出现在调用约定关键字的左边(如果指定了关键字)。例如:
__declspec(dllexport) void __cdecl Function1(void);
__stdcall 表明被调用方清理堆栈。 C#中的函数声明
using System.Runtime.InteropServices;
…
public class Program
{
[DllImport(@"E:/Projects/testdll/debug/testdll.dll")]
public static extern int testfunc(StringBuilder abuf,ref int a);
}
using System.Runtime.InteropServices; System.Runtime.InteropServices 命名空间提供各种各样支持 COM interop 及平台调用服务的成员,使程序可以与非托管代码进行交互操作。 [DllImport(“dllfile path”)] 代码中DllImport关键字作用是告诉编译器入口点在哪里,并将打包函数捆绑在这个类中。在声明的时候还可以添加几个属性:
[DllImport("MyDLL.dll",
EntryPoint="mySum",
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
EntryPoint: 指定要调用的 DLL 入口点。默认入口点名称是托管方法的名称 。 CharSet: 控制名称重整和封送 String 参数的方式 (默认是UNICODE) CallingConvention指示入口点的函数调用约定(默认WINAPI) 注意:必须在标记为”static”和”extern”的方法上指定”DllImport”属性。
数据传递方法
1.基本数据类型的传递
函数参数和返回值可以是C#和C++的各种基本数据类型,如int, float, double, char(注意不是char*)等。 示例: C#代码:
using System;
using System.Text;
using System.Runtime.InteropServices;
class Program
{
[DllImport(@"E:/Projects/testdll/debug/testdll.dll")]
public static extern int testfunc(int a,float b,double c,char d);
static void Main(string[] args)
{
int a = 1;
float b = 12;
double c = 12.34;
char d = 'A';
testfunc(a,b,c,d);
Console.ReadKey();
}
}
C++代码:#include
2.向DLL传入字符串
C#中使用string定义字符串,将字符串对象名传给DLL。 注意:在DLL中更改字符串的值,C#中的值也会改变。 缺点:无法改变字符串的长度,建议使用第3种方法。 C#代码:
using System;
using System.Text;
using System.Runtime.InteropServices;
class Program
{
[DllImport(@"E:/Projects/testdll/debug/testdll.dll")]
public static extern int testfunc(string a);
static void Main(string[] args)
{
string a="Hello World!";
testfunc(a);
Console.ReadKey();
}
}
C++代码:
#include
using namespace std;
extern "C"
{
_declspec(dllexport) int __stdcall testfunc(char* astr)
{
cout<<<<
3.DLL传出字符串
C#中使用StringBuilder对象创建变长数组,并设置StringBuilder的Capacity为数组最大长度。将此对象名传递给DLL,使用char*接收。 C#代码:
using System;
using System.Text;
using System.Runtime.InteropServices;
class Program
{
[DllImport(@"E:/Projects/testdll/debug/testdll.dll")]
public static extern int testfunc(StringBuilder abuf);
static void Main(string[] args)
{
StringBuilder abuf=new StringBuilder();
abuf.Capacity = 100;//设置字符串最大长度
testfunc(abuf);
Console.ReadKey();
}
}
C++代码:
#include
using namespace std;
extern "C"
{
_declspec(dllexport) int __stdcall testfunc(char* astr)
{
*astr++='a';
*astr++='b';//C#中abuf随astr改变
*astr='/0';
return 0;
}
}
4.DLL传递结构体(需要在C#中重新定义,不推荐使用)
C#中使用StructLayout重新定义需要使用的结构体。 注意:在DLL改变结构体成员的值,C#中随之改变。 C#代码:
using System;
using System.Text;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct Point
{
public double x;
public double y;
}
class Program
{
[DllImport(@"E:/Projects/testdll/debug/testdll.dll")]
public static extern int testfunc(Point p);
static void Main(string[] args)
{
Point p;
p.x = 12.34;
p.y = 43.21;
testfunc(p);
Console.ReadKey();
}
}
C++代码:
#include
using namespace std;
struct Point
{
double x;
double y;
};
extern "C"
{
_declspec(dllexport) int __stdcall testfunc(Point p)
{
cout<<<", "<<
using namespace std;
extern "C"
{
_declspec(dllexport) int __stdcall testfunc(int a,float b,double c,char d)
{
cout<<<", "<<<", "<<<", "<<
C/C++ 与 C#混合编程相关推荐
- matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)
摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...
- C和C++混合编程的Makefile的编写!
在项目实践中,经常遇到C和C++混合编程的情况. 目前的业务需求是: c写的几个文件,和一个C++文件要整合为一个动态库,被C++调用.而这个动态库的生成过程中,会链接几个基础的开发库,比如libz, ...
- 怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记
C# matlab混合编程 徐凯Email:xukai19871105@http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html 这几天突然想搞一搞 ...
- matlab2014a + win764bit + vs2013混合编程(.m转成dll供C++调用)
在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目的. 1. 使用matlab生成dll文件 1.1 首先需要带有 ...
- .Net(c#) 通过 Fortran 动态链接库,实现混合编程
c# 与 Fortran 混合编程解决方案主要有两种: 1. 进程级的交互:在 Fortran 中编译为控制台程序,.Net 调用(System.Diagnostics.Process),然后使用 P ...
- c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)
记得当初一个师姐问我知不知道如何在Matlab里调用C++的程序,还真把我问住了.因为我以前就知道C++调用Matlab的方法,这方面网上资料一大堆.没想到现在自己突发奇想又遇到另外一个问题,Matl ...
- Linux C++与Python混合编程(g++生成链接库与python调用)
gcc/g++ 链接库的编译与链接 这一篇对动态链接库和静态链接库以及编译结果讲得很清楚,目前看到最好的. Linux下Python与C++混合编程
- 基于引擎的matlab+vc混合编程的配置
前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...
- 开题:在移动开发中使用JavaScript进行混合编程提高代码复用率
2019独角兽企业重金招聘Python工程师标准>>> 问题 通常开发一个移动应用,因为存在iOS和Android两种操作系统,因此所有代码都要使用两种语言编写两遍,因此几乎所有开发 ...
- c 使用matlab引擎,[转载]C与MATLAB混合编程之调用MATLAB引擎
Visual Studio调用MATLAB需要的配置已经在<Visual Studio调用MATLAB的配置>一文中给出了详细的步骤,本文将介绍混合编程的示例. 在C中调用MATLAB,据 ...
最新文章
- python分析基金数据,[Python数据分析]numpy基金会,基础
- oracle取32位唯一码,Oracle导出导入dmp文件命令,以及excel生成32位uuid
- 【组合数学】排列组合 ( 多重集排列 | 多重集全排列 | 多重集非全排列 所有元素重复度大于排列数 | 多重集非全排列 某些元素重复度小于排列数 )
- Android进阶笔记09:Android 万能适配器
- Pygame介绍以及下载
- 数据库开发——MySQL——多表查询
- 可以通过发声把玻璃震碎吗?
- setlenient_Java日历setLenient()方法与示例
- pandas python groupby_python – 如何使用pandas groupby汇总多个列?
- 助力 Android 抗衡 iOS,华为发布方舟编译器!
- 都说「跳一跳」是微信抄袭了育碧,万万没想到,他们在一起了!
- 新手必读:PhoneGap入门六大问题
- matlab2c使用c++实现matlab函数系列教程-poisspdf函数
- 报告表明混合云带来IT管理挑战
- js:数据结构笔记10--图和图算法
- 运维服务器环境梳理方案,运维工作梳理
- sparking Streaming version 2.3.2+kafka接收实时流数据找不到hive创建的数据库问题
- 基于matlab的手写体数字识别系统
- 多大样本量才能模拟出中心极限定理
- Data Fabric,下一个风口?
热门文章
- 微信小程序不支持打开非业务域名_一行代码网站封装微信小程序,并解决微信小程序不支持打开非业务域名https://,请重新配置的问题!...
- 代码托管工具-Git/tortoise,develop与master的推送概念、日志找回以及小乌龟tortoise的简单使用
- 基于 python 多光谱遥感数据处理、图像分类、定量评估及机器学习方法
- 【转帖】电视分辨率与“线”
- PARTsolutions助力德国最著名的高档汽车制造商戴姆勒集团
- java窗口背景颜色的设定----setBackground()的用法
- 物理地址、有效地址、逻辑地址和线性地址
- Educode--故宫壁纸网页图片的爬取实验
- 创业,不能兼职(59)--- 多了个兄弟,却有很多遗憾 又来个哥们 ,好像比我还有胆魄...
- dm365 gpio按键驱动分析