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

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

对应的C#代码为:

C# Code Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. publicstaticexternint test(int m);
  3. privatevoid 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(constint N, int& Z)
  3. {
  4. Z=N+10;
  5. }

对应的C#代码:

C# Code Copy Code To Clipboard
  1. [DllImport("test.dll", EntryPoint = "#1")]
  2. publicstaticexterndouble test(int m, refint n);
  3. privatevoid 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(constint N, constint 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. publicstaticexterndouble test(int N, int[] n, refint Z);
  3. privatevoid button1_Click(object sender, EventArgs e)
  4. {
  5. int N = 0;
  6. int[] n;
  7. n = newint[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(constint M, constint 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. publicstaticexternvoid test(int N, int[] n, [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=1)] int[] Z);
  3. privatevoid button1_Click(object sender, EventArgs e)
  4. {
  5. int N = 1000;
  6. int[] n, Z;
  7. n = newint[N];Z = newint[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

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

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

        C#调用C++编写的DLL函数, 以及各种类型的参数传递 1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int ...

  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. Chocolatey:Windows软件包管理器

    Chocolatey 2016-08-03 https://chocolatey.org/ Chocolatey是一个Windows软件包管理器,就像Nuget或者npm,或者说类似Linux上的ap ...

  2. PHP递归

    <?php /** * Mr.xml * 处理无限级分类 */ class Category{ /** * [递归一维数组] * @param [type] $cate [传递一个数组$cate ...

  3. 让hyper-v虚拟机中类ubuntu系统可以全屏

    很久之前一直都没有方法让linux虚拟机支持hyper-v的全屏,只能以1024x768或者800x600等方形屏幕 如果是windows7以前的电脑,可以用mstsc远程桌面修改分辨率,window ...

  4. Ajax请求过程中显示“进度”的简单实现

    Ajax在Web应用中使用得越来越频繁.在进行Ajax调用过程中一般都具有这样的做法:显示一个GIF图片动画表明后台正在工作,同时阻止用户操作本页面(比如Ajax请求通过某个按钮触发,用户不能频繁点击 ...

  5. mysql查询语句分析 explain用法

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了,如: explai ...

  6. 【pyhton】【转】修改递归次数

    import sys sys.setrecursionlimit(1500) # set the maximum depth as 1500 def recursion(n): if(n <= ...

  7. Nginx+uWSIG+Django+websocket的实现

    1.Django+websocket django-websocket dwebsocket django-websocket是旧版的,现在已经没有人维护,dwebsocket是新版的,推荐使用dwe ...

  8. chrome常用插件

    1. ModHeader 功能:修改请求头部信息 安装地址:https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnf ...

  9. 关于JS中的apply()与call()使用方法与区别

    Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里 ...

  10. Bootstrap 分页功能

    function bootstrappage() { var options = { currentPage: currentPage, totalPages: totalPages, size: ' ...