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#混合编程相关推荐

  1. matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  2. C和C++混合编程的Makefile的编写!

    在项目实践中,经常遇到C和C++混合编程的情况. 目前的业务需求是: c写的几个文件,和一个C++文件要整合为一个动态库,被C++调用.而这个动态库的生成过程中,会链接几个基础的开发库,比如libz, ...

  3. 怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记

    C# matlab混合编程 徐凯Email:xukai19871105@http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html 这几天突然想搞一搞 ...

  4. matlab2014a + win764bit + vs2013混合编程(.m转成dll供C++调用)

    在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目的. 1. 使用matlab生成dll文件 1.1 首先需要带有 ...

  5. .Net(c#) 通过 Fortran 动态链接库,实现混合编程

    c# 与 Fortran 混合编程解决方案主要有两种: 1. 进程级的交互:在 Fortran 中编译为控制台程序,.Net 调用(System.Diagnostics.Process),然后使用 P ...

  6. c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)

    记得当初一个师姐问我知不知道如何在Matlab里调用C++的程序,还真把我问住了.因为我以前就知道C++调用Matlab的方法,这方面网上资料一大堆.没想到现在自己突发奇想又遇到另外一个问题,Matl ...

  7. Linux C++与Python混合编程(g++生成链接库与python调用)

    gcc/g++ 链接库的编译与链接 这一篇对动态链接库和静态链接库以及编译结果讲得很清楚,目前看到最好的. Linux下Python与C++混合编程

  8. 基于引擎的matlab+vc混合编程的配置

    前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...

  9. 开题:在移动开发中使用JavaScript进行混合编程提高代码复用率

    2019独角兽企业重金招聘Python工程师标准>>> 问题 通常开发一个移动应用,因为存在iOS和Android两种操作系统,因此所有代码都要使用两种语言编写两遍,因此几乎所有开发 ...

  10. c 使用matlab引擎,[转载]C与MATLAB混合编程之调用MATLAB引擎

    Visual Studio调用MATLAB需要的配置已经在<Visual Studio调用MATLAB的配置>一文中给出了详细的步骤,本文将介绍混合编程的示例. 在C中调用MATLAB,据 ...

最新文章

  1. python分析基金数据,[Python数据分析]numpy基金会,基础
  2. oracle取32位唯一码,Oracle导出导入dmp文件命令,以及excel生成32位uuid
  3. 【组合数学】排列组合 ( 多重集排列 | 多重集全排列 | 多重集非全排列 所有元素重复度大于排列数 | 多重集非全排列 某些元素重复度小于排列数 )
  4. Android进阶笔记09:Android 万能适配器
  5. Pygame介绍以及下载
  6. 数据库开发——MySQL——多表查询
  7. 可以通过发声把玻璃震碎吗?
  8. setlenient_Java日历setLenient()方法与示例
  9. pandas python groupby_python – 如何使用pandas groupby汇总多个列?
  10. 助力 Android 抗衡 iOS,华为发布方舟编译器!
  11. 都说「跳一跳」是微信抄袭了育碧,万万没想到,他们在一起了!
  12. 新手必读:PhoneGap入门六大问题
  13. matlab2c使用c++实现matlab函数系列教程-poisspdf函数
  14. 报告表明混合云带来IT管理挑战
  15. js:数据结构笔记10--图和图算法
  16. 运维服务器环境梳理方案,运维工作梳理
  17. sparking Streaming version 2.3.2+kafka接收实时流数据找不到hive创建的数据库问题
  18. 基于matlab的手写体数字识别系统
  19. 多大样本量才能模拟出中心极限定理
  20. Data Fabric,下一个风口?

热门文章

  1. 微信小程序不支持打开非业务域名_一行代码网站封装微信小程序,并解决微信小程序不支持打开非业务域名https://,请重新配置的问题!...
  2. 代码托管工具-Git/tortoise,develop与master的推送概念、日志找回以及小乌龟tortoise的简单使用
  3. 基于 python 多光谱遥感数据处理、图像分类、定量评估及机器学习方法
  4. 【转帖】电视分辨率与“线”
  5. PARTsolutions助力德国最著名的高档汽车制造商戴姆勒集团
  6. java窗口背景颜色的设定----setBackground()的用法
  7. 物理地址、有效地址、逻辑地址和线性地址
  8. Educode--故宫壁纸网页图片的爬取实验
  9. 创业,不能兼职(59)--- 多了个兄弟,却有很多遗憾 又来个哥们 ,好像比我还有胆魄...
  10. dm365 gpio按键驱动分析