C#调用C++编写的DLL函数, 以及各种类型的参数传递

1. 如果函数只有传入参数,比如:

C/C++ Code Copy Code To Clipboard
  1. //C++中的输出函数
  2. int __declspec(dllexport) test(const int N)
  3. {
  4. return N+10;
  5. }

对应的C#代码为:

C# Code Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. public static extern int test(int m);
  3. private void button1_Click(object sender, EventArgs e)
  4. {
  5. textBox1.Text= test(10).ToString();
  6. }

2. 如果函数有传出参数,比如:

C/C++ Code Copy Code To Clipboard
  1. //C++
  2. void __declspec(dllexport) test(const int N, int& Z)
  3. {
  4. Z=N+10;
  5. }

对应的C#代码:

C# Code Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. public static extern double test(int m, ref int n);
  3. private void button1_Click(object sender, EventArgs e)
  4. {
  5. int N = 0;
  6. test1(10, ref N);
  7. textBox1.Text= N.ToString();
  8. }

3. 带传入数组:

C/C++ Code Copy Code To Clipboard
  1. void __declspec(dllexport) test(const int N, const int n[], int& Z)
  2. {
  3. for (int i=0; i<N; i++)
  4. {
  5. Z+=n[i];
  6. }
  7. }

C#代码:

C# Code Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. public static extern double test(int N, int[] n, ref int Z);
  3. private void button1_Click(object sender, EventArgs e)
  4. {
  5. int N = 0;
  6. int[] n;
  7. n = new int[10];
  8. for (int i = 0; i < 10; i++)
  9. {
  10. n[i] = i;
  11. }
  12. test(n.Length, n, ref N);
  13. textBox1.Text= N.ToString();
  14. }

4. 带传出数组:

C++不能直接传出数组,只传出数组指针,

C/C++ Code Copy Code To Clipboard
  1. void __declspec(dllexport) test(const int M, const int n[], int *N)
  2. {
  3. for (int i=0; i<M; i++)
  4. {
  5. N[i]=n[i]+10;
  6. }
  7. }

对应的C#代码:

C# Code Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. public static extern void test(int N, int[] n, [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z);
  3. private void button1_Click(object sender, EventArgs e)
  4. {
  5. int N = 1000;
  6. int[] n, Z;
  7. n = new int[N];Z = new int[N];
  8. for (int i = 0; i < N; i++)
  9. {
  10. n[i] = i;
  11. }
  12. test(n.Length, n, Z);
  13. for (int i=0; i<Z.Length; i++)
  14. {
  15. textBox1.AppendText(Z[i].ToString()+"n");
  16. }
  17. }

这里声明函数入口时,注意这句 [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z

在C#中数组是直接使用的,而在C++中返回的是数组的指针,这句用来转化这两种不同的类型.

关于MarshalAs的参数用法以及数组的Marshaling,可以参见这篇转帖的文章: http://www.kycis.com/blog/read.php?21

5. 传出字符数组:

C++定义:

C/C++ Code Copy Code To Clipboard
  1. void __declspec(dllexport) test(int i, double &a, double &b, char t[5])

C#对应声明:

C# Code Copy Code To Clipboard
  1. [DllImport("dll.dll", EntryPoint = "test")]
  2. public static extern void test(int i, ref double a, ref double b, [Out, MarshalAs(UnmanagedType.LPArray)] char[] t);
  3. 。。。
  4. char[] t = new char[5];
  5. test(i, ref a, ref b, t);

字符数组的传递基本与4相似,只是mashalAs 时前面加上Out。

 

C#调用C++编写的DLL函数, 以及各种类型的参数传递 (转载)的更多相关文章

  1. C#调用C++编写的DLL函数, 以及各种类型的参数传递 z

    1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int__declspec(dllexport) test(consti ...

  2. C#动态调用C++编写的DLL函数

    C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...

  3. 使用clr 调用C#编写的dll中的方法的全解释

    使用clr 调用C#编写的dll中的方法的全解释1.数据库初始化:将下面这段代码直接在运行就可以初始化数据库了exec sp_configure 'show advanced options', '1 ...

  4. C# 调用delphi编写的dll

    技术实现 如何逐步实现动态库的加载,类型的匹配,动态链接库函数导出的定义,参考下面宏定义即可: #define LIBEXPORT_API extern "C" __declspe ...

  5. Delphi7调用DelphiXE编写的DLL问题

    http://bbs.csdn.net/topics/380045353 用DelphiXE在WIN2008下编写一个访问WebServices的DLL ws.dll,只有一个输出函数,如下: fun ...

  6. [JNA系列]Java调用Delphi编写的Dll之JNA使用

    介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...

  7. C#调用C++编写的dll

    界面还是C#写的方便点,主要是有一个可视化的编辑器,不想画太多的时间在界面上.但是自己又对C++了解的多一些,所以在需要一个良好的界面的情况下,使用C++来写代码逻辑,将其编译成一个dll,然后用C# ...

  8. PB调用C#编写的Dll类库

    在c# 中编写com组件,供PB调用实例 前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意. c#中新建类库 类库类型为通用类库,项目名为AddC ...

  9. 通过C#去调用C++编写的DLL

    这个问题缠了我2个小时才弄出来,其实很简单.当对方提供一个dll给你使用时,你需要去了解这个dll 是由什么语言写的,怎么编译的,看它的编译类型.这样即使在没有头绪时,你可以先尝使用一些比较热门的编译 ...

随机推荐

  1. JAVA的单例模式与延时加载

    延迟加载(lazy load)是(也称为懒加载),也叫延迟实例化,延迟初始化等,主要表达的思想就是:把对象的创建延迟到使用的时候创建,而不是对象实例化的时候创建.延迟加载机制是为了避免一些无谓的性能开 ...

  2. DFS序详解

    dfs序就是一棵树在dfs遍历时组成的节点序列. 它有这样一个特点:一棵子树的dfs序是一个区间. 下面是dfs序的基本代码: void dfs(int x,int pre,int d){//L,R表 ...

  3. 在as3中使用protobuf

    在最近参与开发的adobe air项目中,前后端的通信协议从XML.JSON再到protobuf,最后选择protobuf原因,主要是前后端维护protobuf协议就行了,同时还可以利用IDE做一些编 ...

  4. lua Getter&Setter简单实现

    lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现: class.lua local type = type local rawset = rawset local setm ...

  5. QT常用资料

    QTableView介绍 Qt 自定义 滚动条 样式 QTableWidget控件总结  QTableWidget的使用和美工总结 QT__stylesheet__操作 QSS QT皮肤(QSS)编程 ...

  6. linq语法大全(转集)

     Join操作符 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), Selec ...

  7. Ubuntu16.04+Tensorlow+caffe+opencv3.1+theano部署

    1.首先安装Ubuntu16.04系统. 2.安装显卡驱动 在官网上下载最新的NVIDIA-Linux-x86_64-375.26.run驱动.然后 Ctrl+Alt+F1进入控制台,输入 sudo ...

  8. Datatables回调函数中文

    Datatables——回调函数 ------------------------------------------------- fnCookieCallback:还没有使用过 $(documen ...

  9. 兼容性js中setTimeout 传参“保值”方案

    这里所谓“保值”,是指在setTimeout中指定的时间后,执行指定的方法所用到的“参数”值,跟执行setTimeout时该“参数”值一样.是不是有点懵?看如下例子: ================ ...

  10. LeetCode "Third Maximum Number"

    Straight-forward strategy.. please take care of all details - data type, assignment order etc. class ...