详解C#使用C++生成的DLL

C++高效灵活,适用于编写较为复杂的算法;而C#简单易用,容易做出优美宜人的界面。因此,将它们结合起来是一个不错的选择!关于这个命题,在大二刚学C#时就有想过,不过一直没有去做。如今,大学将毕,正好在毕设的需求下,收集资料作了一番学习现在此做个备忘吧!

(一)项目整体框架:

整合收集的资料和自己以往所学的知识,我将整个“C#使用C++生成的DLL”解决方案分成三个部分:①C++生成DLL项目;②调用DLL的中间桥梁类库—.NET基本组件(以类库形式封装的类、对象);③使用DLL的C#窗体程序。编程时,可以先创建一个解决方案,再逐渐将三个项目添加进去。如下图所示:
这里写图片描述

(二)涉及主要知识点:

(1)C的编译预处理知识:①宏定义(#define);②文件包含(#include)等。
(2)创建.NET基本组件(类与对象构成)并通过引用使用之(本文将之作为调用DLL的中间桥梁);
(3)设置导出函数格式:extern "C" _declspec(dllexport) 函数类型 _stdcall 函数名(参数列表)(采用C风格!)
(4)DLL的C#调用入口点:[DllImport(@"C++生成的DLL最终绝对路径",CallingConvention =CallingConvention.StdCall,CharSet =CharSet.Ansi,EntryPoint ="Area", ExactSpelling = false,SetLastError = true)]

(三)步骤详解:

【示例使用VS2015专业版】
(1)创建一个空的解决方案:新建项目→其他项目类型→
VS解决方案→输入方案名称MySolution_01→选择路径并保存。
这里写图片描述
(2)创建C++编写的DLL项目MyDLL:
1)创建MyDLL项目:右键上一步创建的解决方案→添加→新建项→ VisualC ++ →Win32项目→输入名称→确定→选DLL→完成。
这里写图片描述这里写图片描述这里写图片描述
2)写入代码:
备注:不管是在“头文件”还是“源文件”中添加子项,都是通过:右键→添加→新建项】
这里写图片描述
①包含自定义头文件MyInclude.cpp:建立一个文本并放在解决方案文件夹中→改后缀为.cpp/.c等→VS打开并添加如图所示代码。【这一步不必要,是我自己增加的!】
这里写图片描述写入代码保存后,在stdafx.h(头文件下自动创建的)中将MyInclude.cpp包含进去:
这里写图片描述
②添加函数导出格式头文件DLLExport.h(需按照2)下的备注所说先创建此文件再添加代码):
这里写图片描述
③C++DLL(算法)主要代码MyDLL.cpp:
这里写图片描述
④在“源文件”中添加“模块文件”NameDLL.def(确保导出函数名及入口点函数不变):
这里写图片描述

(3)创建调用中间过度类库DLL_BridgeClass:
1)创建项目DLL_BridgeClass:右键解决方案→添加→新建项→ VisualC# →类库→输入类库名称→确定。
这里写图片描述
2)写入代码:
这里写图片描述

(4)创建调用DLL的C#窗体程序UseMyDLL:
1)创建项目UseMyDLL:右键解决方案→添加→新建项→ VisualC# →Windows窗体应用程序→输入名称UseMyDLL→确定。

2)写入代码:
代码应对照设计的窗体看,就可以很清晰了!
这里写图片描述
这里写图片描述
3)运行结果:
这里写图片描述

(四)关键点集合:

(1)3个项目中相关函数的签名应该完全一样!
(2)注意“函数导出格式”和“DLL的C#调用入口点”书写格式。
(3)“DLL的C#调用入口点”:[DllImport(@"C++生成的DLL最终绝对路径",CallingConvention =CallingConvention.StdCall,CharSet =CharSet.Ansi,EntryPoint ="Area", ExactSpelling = false,SetLastError = true)],请注意C++项目不管是用Release还是Debuge模式进行调试(这里一般用Release模式),DllImport(“”)这里要用最终MyDLL.dll的绝对路径才不会出错(可以去项目文件里查看)!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_xxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值