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. 用Join子句进行分组联接

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. linux 下如何抓取HTTP流量包(httpry)

    基于某些原因你需要嗅探HTTP Web流量(即HTTP请求和响应).例如,你可能会测试Web服务器的性能,或者x奥uy调试Web应用程序或RESTful服务 ,又或者试图解决PAC(代理自动配置)问题 ...

  3. Qt开发中的实用笔记二--中文转码问题和string转换问题:

    一,中文乱码转码问题 1,转码三句话:window下默认是GBK格式,linux下默认是UTF-8,看情况转换UTF-8/GBK QTextCodec::setCodecForTr(QTextCode ...

  4. halcon运行版设置

  5. 利用C语言获得网页编码

    #include <stdio.h> #include <winsock.h> #include <string.h> #pragma comment(lib, & ...

  6. electron知识点

    1.打开chrome开发工具栏: BrowserWindow.openDevTools();

  7. centos nginx server_name 配置域名访问规则

    今天配置Server_name时,希望禁用一些域名,应为这些域名我想让通过另外一个Server配置 server_name "~^((\w*[^w]{1}\w*)|w{1,2})\.hell ...

  8. 如何判断exe或dll的目标平台及是否是.NET?

    1. COFF文件头中偏移0处的Machine指示目标机器类型(IMAGE_FILE_MACHINE_AMD64等),偏移18处的Characteristics位指示文件属性(IMAGE_FILE_3 ...

  9. Weblogic是瓦特?和JVM是瓦特关系?

    所谓固定内存60M是瓦特? 以下内容是个瓦特? “总内存大小=堆内存+非堆内存1200m:为堆内存大小,如果不指定后者参数则有最大数限制,网上很多文章认为这就是JVM内存,-Xmx为设置最大堆内存60 ...

  10. C++中typename和class的区别

    C++中typename和class的区别 在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对c ...