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

//C++中的输出函数
int __declspec(dllexport) test(const int N)
{
return N+;
}

对应的C#代码为:

[DllImport("test.dll", EntryPoint = "#1")]
public static extern int test(int m); private void button1_Click(object sender, EventArgs e)
{
textBox1.Text= test().ToString();
}

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

void __declspec(dllexport) test(const int N, int& Z)
{
Z=N+;
}

对应的C#代码:

[DllImport("test.dll", EntryPoint = "#1")]
public static extern double test(int m, ref int n); private void button1_Click(object sender, EventArgs e)
{
int N = ;
test1(, ref N);
textBox1.Text= N.ToString();
}

3. 带传入数组:

void __declspec(dllexport) test(const int N, const int n[], int& Z)
{
for (int i=; i<N; i++)
{
Z+=n[i];
}
}

C#代码:

[DllImport("test.dll", EntryPoint = "#1")]
public static extern double test(int N, int[] n, ref int Z); private void button1_Click(object sender, EventArgs e)
{
int N = ;
int[] n;
n = new int[];
for (int i = ; i < ; i++)
{
n[i] = i;
}
test(n.Length, n, ref N);
textBox1.Text= N.ToString();
}

4. 带传出数组:

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

void __declspec(dllexport) test(const int M, const int n[], int *N)
{
for (int i=; i<M; i++)
{
N[i]=n[i]+;
}
}

对应的C#代码:

[DllImport("test.dll", EntryPoint = "#1")]
public static extern void test(int N, int[] n, [MarshalAs(UnmanagedType.LPArray,SizeParamIndex=)] int[] Z); private void button1_Click(object sender, EventArgs e)
{
int N = ;
int[] n, Z;
n = new int[N];Z = new int[N];
for (int i = ; i < N; i++)
{
n[i] = i;
}
test(n.Length, n, Z);
for (int i=; i<Z.Length; i++)
{
textBox1.AppendText(Z[i].ToString()+"n");
}
}

这里声明函数入口时,注意这句 [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
void __declspec(dllexport) test(int i, double &a, double &b, char t[])  

C#对应声明:

[DllImport("dll.dll", EntryPoint = "test")]
public static extern void test(int i, ref double a, ref double b, [Out, MarshalAs(UnmanagedType.LPArray)] char[] t);
。。。
char[] t = new char[];
test(i, ref a, ref b, t);

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

C#调用C++的dll各种传参的更多相关文章

  1. C#调用DLL各种传参

    C++#define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int osVersi ...

  2. Node调用C++(dll)

    最近开始搞毕设了,打算用自己拿手的js来搞,但是仿佛入坑了,Node还不是很熟.总之,兵来将挡,水来土掩嘛,带着问题学习才是最高效的. 折腾1:Node 调用 C++ 刚开始,虽然我老师把dll文件给 ...

  3. golang调用c++的dll库文件

    最近使用golang调用c++的dll库文件,简单了解了一下,特作此笔记:一.DLL 的编制与具体的编程语言及编译器无关 dll分com的dll和动态dll,Com组件dll:不管是何种语言写的都可以 ...

  4. vs2010下C++调用lib或dll文件

    注: DLL:表示链接库,包含dll,lib文件: dll: 表示my.dll文件 lib: 表示my.lib文件 C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法 1  设置工程的 ...

  5. Mybatis调用PostgreSQL存储过程实现数组入参传递

    注:本文来源于 < Mybatis调用PostgreSQL存储过程实现数组入参传递  > 前言 项目中用到了Mybatis调用PostgreSQL存储过程(自定义函数)相关操作,由于Pos ...

  6. C++学习3--编程基础(vector、string、三种传参)

    知识点学习 Vector容器 vector是C++标准程序库中的一个类,其定义于头文件中,与其他STL组件一样,ventor属于STD名称空间: ventor是C++标准程序库里最基本的容器,设计之初 ...

  7. C#调用C/C++ DLL 参数传递和回调函数的总结

    原文:C#调用C/C++ DLL 参数传递和回调函数的总结 Int型传入: Dll端: extern "C" __declspec(dllexport) int Add(int a ...

  8. 浅谈C++三种传参方式

    浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...

  9. 关于C#调用非托管DLL,报“内存已损坏的”坑,坑,坑

    因客户需求,与第三方对接,调用非托管DLL,之前正常对接的程序,却总是报“内存已损坏的异常”,程序进程直接死掉,折腾到这个点(2018-05-11 00:26),终于尘埃落定,直接上程序. 之前的程序 ...

随机推荐

  1. 在web项目中获取ApplicationContext上下文的3种主要方式及适用情况

    最近在做web项目,需要写一些工具方法,涉及到通过Java代码来获取spring中配置的bean,并对该bean进行操作的情形.而最关键的一步就是获取ApplicationContext,过程中纠结和 ...

  2. 分享一款架子鼓游戏【drum】

    视频演示: 电脑版和安卓版都有,没有ios版. 适合想练架子鼓,但是还没买架子鼓的朋友.可以先当做游戏来练练节奏感...下载如下: 电脑版下载>> 手机安卓版下载>>

  3. 【MM系列】SAP S/4 HANA BP创建客户/供应商的一点想法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP S/4 HANA BP创建客 ...

  4. 【AMAD】django-silk -- 为Django提供如丝般顺滑的性能测量

    动机 简介 个人评分 动机 Django作为一个web框架,进行性能测量是很复杂的,不可以使用传统的程序profile工具. 因为,web app的性能是多维度的,不仅仅是代码执行效率,还包括网络延时 ...

  5. LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...

  6. SIFT图像配准 python3.6 + opencv3.3代码

    opencv3.x 中部分函数有改变: 1. SIFT:可以采用help(cv2.xfeatures2d)查询 2.drawKeypoints: 同样采用help()方法查询 opencv3 版本si ...

  7. (转)C++ bitset用法

    今天做题发现要用到bitset,找到一篇介绍的巨好的文章. 转载自:https://www.cnblogs.com/magisk/p/8809922.html C++的 bitset 在 bitset ...

  8. Job for jenkins.service failed because the control process exited with error code.

    root@xiakaibi-PC:~# service jenkins restartJob for jenkins.service failed because the control proces ...

  9. 2. zookeeper介绍及集群搭建

    ZooKeeper 概述 Zookeeper 是一个分布式协调服务的开源框架. 主要用来解决分布式集群中 应用系统的一致性问题,例如怎样避免同时操作同一数据造成脏读的问题. ZooKeeper 本质上 ...

  10. 在.Net中使用RedLock实现分布式锁

    ⒈简介 RedLock 分布式锁算法由 Redis 的作者提出,大部分语言都有对应的实现,查看,RedLock.net 是 RedLock 分布式锁算法的 .NET 版实现,用来解决分布式下的并发问题 ...