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. 关于aspx模板页面元素路径的问题,以及对模板页面的理解

    模板页面仅是模板,它不是单独存在的页面,它的路径就是引用它的内容页面的路径. 换句话说,模板页面,只是内容页面上固定的部分.     模板页面引用了的js和CSS,内容页面就不用重新引用了   css ...

  2. 【分享】 高级Visual Basic 编程 清晰pdf+随书源代码光盘

    搞vb6的可能不多,博客园也大多是.net java,近日在网上找到这本好书,想要成为vb高手,这本书不要错过,学完你会发现win32下,vb6还真是无所不能.可贵的是本书的作者是当时vb6 IDE的 ...

  3. DB2实用命令记录

    quiesce tablespace quiesce tablespaces for table <table_name> share; Monitor Switches details ...

  4. 更新 requests 包之后报 has no attribute '__getitem__' 的错

    翻代码的时候看到段一年多前用 python 写的下载图片站图片的代码. 测试下看还能不能下到图片,结果发现跑不起来了,报了个如下的错误: TypeError: 'instancemethod' obj ...

  5. SQL日期(转)

    通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割 (年.月.日等),然后仅仅用分割出来的年.月.日等放在几个 ...

  6. Linux CentOS下shell显示-bash-4.1$ 不显示用户名和主机名的解决方法

    CentOS下新增加一个用户,登录进去会发现shell脚本信息没有显示用户名和主机名,反而显示的是-bash-4.1$,如图所示: 而不是我们经常看到的username@hostname$的组合,看起 ...

  7. PL/SQL — BULK COLLECT用法

    BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎.通常可以在SELECT INTO.FETCH INTO以及RETURNING ...

  8. WPF从入门到放弃系列第一章 初识WPF

    什么是WPF WPF(Windows Presentation Foundation)是微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分.它提供 ...

  9. uCGUI字符串显示过程分析和uCGUI字库的组建

    为什么要分析字符串的显示过程? 学习uCGUI主要是学习如何使用的,为何要深究到源码的层次呢? 就分析字符串显示过程的原因来说,是因为移植汉字字库的需要.uCGUI并么有合适的汉字字库,而且完整的汉字 ...

  10. org.springframework.orm.jpa.JpaTransactionManager

    [第九章] Spring的事务 之 9.2 事务管理器 ——跟我学spring3 http://sishuok@com/forum/blogPost/list/0/2503.html