您的位置:首页 > 编程语言 > C语言/C++

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

2018-01-07 23:32 459 查看
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的绝对路径才不会出错(可以去项目文件里查看)!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# C++ DLL