关于DLL的创建与使用简单描述(C++、C#)
2017-09-27 00:09
1001 查看
前言
前一段时间在学关于DLL的创建与调用,结果发现网络上一大堆别人分享的经验都有点问题。现在整理分享一下自己的方法。DLL的创建(C++)
Debug模式下的DLL最好只被Debug模式下的应用程序调用,Release亦此。首先使用VS创建一个C++动态链接库项目DLLTest,或者可以先创建一个控制台应用程序,当确定程序可以无误运行后,再设置:(项目名) -> 属性 -> 配置属性 -> 常规 -> 配置类型 -> 动态库(.dll) 字符集->使用多字节字符集 (这里不介绍这个过程)
成功创建项目后,以这里的代码为例。添加 DLLTest.h 和 DLLTest.cpp,如图所示:
编辑 DLLTest.h 代码如下:
#ifndef DLLAPI #define DLLAPI _declspec(dllimport) #endif extern "C" { DLLAPI int Add(int a, int b, int c); DLLAPI int Sub(int a, int b); }
说明:
前3行代码可以直接套用,DLLAPI可以随意替换。。。
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。此外, extern "C"可以保证导出函数的函数名不发生改变。
编辑 DLLTest.cpp 代码如下:
#define DLLAPI _declspec(dllexport) #include "DLLTest.h" #include <iostream> DLLAPI int Add(int a, int b, int c) { return a + b + c; } DLLAPI int Sub(int a, int b) { return a - b; }
说明:
第一行代码必须放置于所有代码的前面,否则会出现警告。
现在可以直接运行代码了(生成),确保配置类型是 dll,正确运行的结果应该如下:
使用depends查看DLL如下:
DLL的调用(C++)
首先使用VS创建一个C++控制台应用程序项目DLLTest2,,,,偷懒,,看图看代码
#include <windows.h> #include <iostream> using namespace std; typedef int(*Add)(int a, int b, int c); typedef int(*Sub)(int a, int b); int main() { // LoadLibrary: DLL 所在路径 // 需要一个设置; // 左侧:DLLTest2(项目名) -> 属性 -> 配置属性 -> 常规 -> 字符集 -> 使用多字节字符集 HMODULE hDll = LoadLibrary("E:\\Code\\visual studio 2017\\Projects\\DLLTest\\Debug\\DLLTest.dll"); if (hDll != NULL) { Add add = (Add)GetProcAddress(hDll, "Add"); Sub sub = (Sub)GetProcAddress(hDll, "Sub"); if (add != NULL) { cout << add(2, 3, 4) << endl; } if (sub != NULL) { cout << sub(4, 1) << endl; } FreeLibrary(hDll); } return 0; }
运行结果:
DLL的调用(C#)
这里是创建了一个C# winform项目DLLTestCS(当然也可以不是winform。。。只是碰巧我第一次使用就是用于winform):
添加两个label控件,来查看是否成功:
编写代码,,,就不再说明了- -:
private void Form1_Load(object sender, EventArgs e) { label1.Text = add(1, 2, 3).ToString(); label2.Text = sub(4, 1).ToString(); } // 1.导入 DLL 所在路径,设置函数入口 EntryPoint // 2.!!!!使用 Debug 模式时,只能调用 Debug 模式下生成的 DLL, Release 亦此 [DllImport(@"E:\Code\visual studio 2017\Projects\DLLTest\Debug\DLLTest.dll", EntryPoint = "Add")] private static extern int add(int a, int b, int c); [DllImport(@"E:\Code\visual studio 2017\Projects\DLLTest\Debug\DLLTest.dll", EntryPoint = "Sub")] private static extern int sub(int a, int b);
说明:
private属性随意
static extern必须有(没有的话你也会出错)
函数写在DllImport下方,自行领会下吧- -
运行结果:
emmmmmmmmmmmmmmmmmmm。。。。。。。。。。。
相关文章推荐
- 在C++创建DLL,以及使用C++或者C#分别调用DLL中的方法
- [C++]数据结构:公式化描述的堆栈Stack的简单创建与使用
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 举例说明如何在C#中使用C/C++写的DLL
- 刚才遇到了关于C#使用外部DLL函数上的char*的问题。
- 一个简单的能被C#调用的C++的dll
- 使用C++调用C#的DLL
- 在C#中使用C/C++写的DLL
- C#中使用DllImport调用C++dll
- 创建和使用c#DLL(摘自MSDN)
- .net实例:使用C++调用C#的DLL
- 【原创】C++创建和使用动态链接库之Win32DLL
- 【原创】C++创建和使用动态链接库之常规DLL
- C#中如何创建、生成以及使用DLL
- 在C#中使用C/C++写的DLL
- 关于 C# 调用C++ DLL 的思考
- 使用vs2005创建智能设备的C#和C++混合项目
- C#调用C++写的dll 函数传递参数问题,请有经验的人详细描述
- 在C#中使用C/C++写的DLL
- 仿MFC实现c++按名动态创建对象之续(瘦身以及解决其在dll中使用的问题)