详解C#使用C++生成的DLL
2018-01-07 23:32
459 查看
C++高效灵活,适用于编写较为复杂的算法;而C#简单易用,容易做出优美宜人的界面。因此,将它们结合起来是一个不错的选择!关于这个命题,在大二刚学C#时就有想过,不过一直没有去做。如今,大学将毕,正好在毕设的需求下,收集资料作了一番学习现在此做个备忘吧!
(2)创建.NET基本组件(类与对象构成)并通过引用使用之(本文将之作为调用DLL的中间桥梁);
(3)设置导出函数格式:
(4)DLL的C#调用入口点:
(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)运行结果:
(2)注意“函数导出格式”和“DLL的C#调用入口点”书写格式。
(3)“DLL的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的绝对路径才不会出错(可以去项目文件里查看)!
相关文章推荐
- PB调用SAP的Web Service结构体数组参数方法详解(使用C#调用Web Service生成dll)
- c++中.dll与.lib文件的生成与使用的详解
- 使用C#生成dll并用C++调用dll
- C#调用C++生成的Dll库,Dll使用callback向C#传递指针
- C++中lib 和 dll 的区别、生成以及使用详解
- 【原创】PB调用SAP的Web Service结构体数组参数方法详解(使用C#调用Web Service生成dll)
- c++中使用外部库exe,.dll与.lib文件的生成与使用的详解
- c++中.dll与.lib文件的生成与使用的详解
- 【好】C++中lib 和 dll 的区别、生成以及使用详解
- c++中.dll与.lib文件的生成与使用的详解
- c++中.dll与.lib文件的生成与使用的详解
- c++中.dll与.lib文件的生成与使用的详解
- PB8调用使用C++与C#分别编写生成解压缩带有密码的zip压缩文件的动态链接库dll(部分内容转自互联网)
- 给用C++写的dll写一个接口函数供C#使用
- 用VS2008生成C++代码的dll及在C#中的调用及常见的类型转换
- C# DllImport 系统调用使用详解 托管代码的介绍 EntryPoint的使用
- 使用C++调用C#的DLL (转)
- C#调用使用C++\CLI封装的标准C++ DLL问题:无法访问受保护的内存,这通常指示其他内存已损坏
- 互操作性----C# 调用 C++生成的DLL
- 用VS2008生成C++代码的dll及在C#中的调用及常见的类型转换