C# 调用 C++ DLL方法

感谢小白T哥 学习dll 调用 记录

在C# 中,可以通过 DllImport 调用C++ 的非托管DLL程序。

VS2010中C#调用C++的DLL示例:

一、新建C++ DLL程序

1、新建 C++ Win32项目,类型为DLL。
在这里插入图片描述
生成的文件结构如图:
在这里插入图片描述
其中,“MyDLLFun.cpp”文件为此项目主要源文件。

2、在源文件中添加需要被外部调用的方法。

这里仅仅是添加两个示例方法:
在这里插入图片描述
方法“Add”返回两个整数的和;方法Pow计算X 的 Y 次方,并以指针的形式修改参数 x 地址处的值。

修饰符 extern “C” 包含双重含义:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。而被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

__declspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。

extern “C” __declspec(dllexport)加起来的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做成的DLL。

添加完方法后,编译生成DLL文件。

二、在C#中使用DLL程序。

首先,将新生成的都来了拷贝到C#工程bin\Debug目录下。

然后,利用DllImport导入DLL程序中的方法,为方便管理,新建一个名为CppDll的类,并在此导入DLL方法:
在这里插入图片描述
说明:1)需要引用命名空间 using System.Runtime.InteropServices;

2)建议增加特性 CallingConvention= CallingConvention.Cdecl,不然可能会出现 “堆栈不对称”错误:
  在这里插入图片描述
  3)DLL中的方法,必须申明为 static,extern 的。

最后,在需要的地方调用这些方法即可。
在这里插入图片描述
说明:C++中函数Pow中传的为指针,也即是变量的地址,在C#修饰符 ref 即表示“传址”,所以C++中的 int*对应于 C#中的ref int
三、稍微扩展一下,在函数中传递数组。
在C++中添加函数
在这里插入图片描述
在C++中,函数参数为数组时传递的为数组的首地址,和数组的长度,如上。那么对应于C#中就应该是:
在这里插入图片描述
其中 ref double ary 为某个double类型数组的第一个元素的地址,len为数组长度。

调用时则写为:
在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值