重要参考
c++ dll编写与加载;
C++编程笔记:dll的生成与使用;
8.DLL导出C++类;
在 Visual Studio 中创建 C/C++ DLL;
最主要的参考就是这个vs的官方文件。
C#调用C++类(内含OpenCV代码);
C#调用DLL库的方法
c sharp调用Cpp DLL实战篇(使用opencv3库与qt库).md
一、vs准备
1、建立dll项目
2、建立控制台项目
二、文件
2.1 头文件
DllTest.h
#pragma once
#ifndef DLLTEST_H
#define DLLTEST_H
/**
* 在dll项目中导出,在调用项目中导入.
*/
#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif
/**
* 扩展为C编码.
*/
#define EXTERN_C extern "C"
//整合两个编码
#define EX_API EXTERN_C DLLTEST_API
/**
* 测试结构体的导出.
*/
struct stA
{
int a;
double b;
stA():a(0),b(0.0){}
stA(int n,double d):a(n),b(d){}
};
/**
* 测试类的导出,注意这里没有拓展成C编码.
*/
class DLLTEST_API Car
{
public:
Car();
~Car();
int getWheels();
private:
int m_nWheels;
double m_height;
};
/**
* 测试普通函数的导出,使用拓展为C编码.
*/
EX_API int add(int a, int b);
EX_API int sub(int a, int b);
#endif // !DLLTEST_H
2.2实现
/*****************************************************************//**
* \file DllTest.cpp
* \brief 具体的实现
* 实现不需要使用导出宏
*
* \author pc-1
* \date July 2020
*********************************************************************/
#include"pch.h"
#include"DllTest.h"
#include<iostream>
using namespace std;
Car::Car()
{
m_nWheels = 4;
m_height = 1.5;
}
Car::~Car()
{
}
int add(int a, int b)
{
cout << "called add(a,b)" << endl;
return a + b;
}
int sub(int a, int b)
{
cout << "called sub(a,b)" << endl;
return a - b;
}
int Car::getWheels()
{
cout << "call get Wheels" << endl;
return m_nWheels;
}
三、调用
3.1 创建调用项目
在菜单栏上,选择“文件”>“新建”>“项目”,打开“创建新项目”对话框。
[图片上传失败...(image-8df1f-1595469787799)]
我创建的项目名称为CallTest
。
3.2项目代码
CallTest.cpp
/*****************************************************************//**
* \file CallTest.cpp
* \brief 测试调用生成的dll
*
* \author pc-1
* \date July 2020
*********************************************************************/
#include <iostream>
//包含所需dll中的头文件
#include"DllTest.h"
using namespace std;
int main()
{
//测试单独的函数的调用
int ad = add(1, 1);
cout << ad << endl;
int su = sub(3, 2);
cout << su << endl;
//分割线
cout << "=======================" << endl;
//测试结构体的调用,和正常包含头文件无异
stA A(1, 3.0);
cout << "A:" << A.a << ", " << A.b << endl;
//测试类的调用,能够正常调用,暂时没有发现异常
Car C;
cout << C.getWheels() << endl;
}
3.3 调用项目的配置
3.3.1包含目录或者附加目录
在“属性”>“配置属性” > “C/C++” > “常规”>"附加目录"中添加:
E:\Programing\DllTest\DllTest
这个目录就是我的头文件所在的目录,也可以使用相对目录,或者你编译好的dll和头文件重新放的目录。
3.3.2附加依赖项
“属性”>“配置属性” > “链接器”>"输入" >"附加依赖项"中添加:
DllTest.lib
就是你对应的lib
文件。
3.3.3 附加库目录
就是你的dll所放的地方。
“属性”>“配置属性” > “链接器”>"常规" >"附加库目录"中添加:
E:\Programing\DllTest\x64\Debug
我为了省事就直接使用生成的目录了,只要对应,或者在项目生成文件的目标文件夹就好。
3.3.4 启动项目和生成依赖项
将控制台项目设置为启动项目,并且,被调用项目设置成调用项目的项目依赖项,换句话说,在控制台项目的项目依赖项设置中添加被调用的DllTest
项目。
4使用C#调用C++生成的dll
等测试成功,写在下一篇
网友评论