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的绝对路径才不会出错(可以去项目文件里查看)!