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. [Python]机器学习:PageRank原理与实现

    前言 PageRank是TextRank的前身.顾名思义,TextRank用于文本重要性计算(语句排名)和文本摘要等NLP应用,而Page最初是因搜索引擎需要对网页的重要性计算和排名而诞生.本着追本溯 ...

  2. 05 vue-cli如何运行

    一.index.html index.html跟其他html一样,只有一个空的根节点,提供main.js用来挂载实例,所有内容通过vue来填充. 二.main.js main.js主要是引入vue框架 ...

  3. elasticsearch-head-master下运行npm install报npm WARN elasticsearch-head@0.0.0 license should be a valid SPDX license expression

    2个月没有启动es和es配套服务,今天运行时,发现如下问题: 运行npm install 出现npm WARN elasticsearch-head@0.0.0 license should be a ...

  4. Matlab中psf2otf()函数在opencv中的实现

    在Matlab中有个psf2otf()函数,可以将小尺寸的点扩散函数,扩大尺寸,并作二维傅里叶变换,opencv中没有这个函数,所以编了这么个函数: /************************ ...

  5. 关于moment().format()

    链接在这儿http://momentjs.cn/ 想要获取单独的年份或者月份可以使用:   moment().format('YYYY')和moment().format('MM') 随手记一下...

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

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

  7. python控制流 -- if、for、while、range()、sys.exit()

    1.布尔值 “布尔”数据类型只有两种:True和False    #首字母以T或F开头,后面小写,且不能作为变量赋值 2.比较操作符 == 等于 != 不等于 <  小于 >  大于 &l ...

  8. 如何获取字符串中某个具体的数值--通过json.load转化成字典形式获取

    r=requests.get('http://httpbin.org/get').text print(r) # print(type(r)) # 如果要获取User-Agent的详细数值,需要做JS ...

  9. k8s的一些基本命令

    kubernetes用到的一些命令 kubectl管理工具以及命令 基础命令:create,delete,get,run,expose,set,explain,edit. create命令:根据文件或 ...

  10. 优秀java博客

    https://www.jianshu.com/p/efb58b7115bf?utm_source=tuicool https://www.nowcoder.com/discuss/110317 ht ...