c++本地动态连接库代码
c++本地动态连接库代码 |

1 #pragma once
2 #include "stdafx.h"
3
4 #ifdef PERSON_EXPORTS
5 #define PERSON_API __declspec(dllexport)
6 #else
7 #define PERSON_API __declspec(dllimport)
8 #endif
9
10 class PERSON_API CPerson
11 {
12 public:
13 CPerson(LPCTSTR pszName, SYSTEMTIME birth);
14 unsigned int getAge(void);
15
16 private:
17 TCHAR _name[256];
18 SYSTEMTIME _birth;
19 };
20
21 #ifdef __cplusplus
22 extern "C"{
23 #endif
24 extern PERSON_API int nVal;
25 PERSON_API int nFunc(void);
26 #ifdef __cplusplus
27 }
28 #endif

Source |
1// CPerson.cpp: 定义 DLL 应用程序的导出函数。

1 // CPerson.cpp: 定义 DLL 应用程序的导出函数。
2 //
3
4 #include "stdafx.h"
5 #include "CPerson.h"
6
7 CPerson::CPerson(LPCTSTR pszName, SYSTEMTIME birth)
8 {
9 _birth = birth;
10 if (pszName != nullptr)
11 lstrcpy(_name, pszName);
12 }
13
14 unsigned int CPerson::getAge(void)
15 {
16 SYSTEMTIME st;
17 GetSystemTime(&st);
18 UINT age = st.wYear - _birth.wYear;
19 if (_birth.wMonth > st.wMonth ||
20 (_birth.wMonth == st.wMonth && _birth.wDay > st.wDay))
21 {
22 --age;
23 }
24
25 return age;
26 }
27
28 PERSON_API int nVal = 20180403;
29 PERSON_API int nFunc(void)
30 {
31 return 1816;
32 }

2 //
3
4 #include "stdafx.h"
5 #include "CPerson.h"
6
7 CPerson::CPerson(LPCTSTR pszName, SYSTEMTIME birth)
8 {
9 _birth = birth;
10 if (pszName != nullptr)
11 lstrcpy(_name, pszName);
12 }
13
14 unsigned int CPerson::getAge(void)
15 {
16 SYSTEMTIME st;
17 GetSystemTime(&st);
18 UINT age = st.wYear - _birth.wYear;
19 if (_birth.wMonth > st.wMonth ||
20 (_birth.wMonth == st.wMonth && _birth.wDay > st.wDay))
21 {
22 --age;
23 }
24
25 return age;
26 }
27
28 PERSON_API int nVal = 20180403;
29 PERSON_API int nFunc(void)
30 {
31 return 1816;
32 }
c++/cli包装代码 |

1 #pragma once
2 #include "CPerson.h"
3
4 using namespace System;
5
6 namespace Adapter
7 {
8 public ref class Person
9 {
10 public:
11 Person(String ^name, DateTime birth);
12 virtual ~Person();
13
14 property unsigned int Age
15 {
16 unsigned int get();
17 }
18
19 static int CallnVal();
20 static int CallnFunc();
21
22 private:
23 Person(): _person(nullptr) { }
24 CPerson *_person;
25 };
26 }

Source |
1 #include "stdafx.h"

1 #include "stdafx.h"
2 #include "Person.h"
3 #include <vcclr.h>
4
5 Adapter::Person::Person(String ^ name, DateTime birth)
6 {
7 SYSTEMTIME st = { 0 };
8 st.wYear = birth.Year;
9 st.wMonth = birth.Month;
10 st.wDay = birth.Day;
11
12 pin_ptr<const TCHAR> psz = PtrToStringChars(name);
13
14 _person = new CPerson(psz, st);
15 }
16
17 Adapter::Person::~Person()
18 {
19 //System::Diagnostics::Debugger::Log(0, "Debug", "Person destructor.");
20 if (_person != nullptr)
21 {
22 CPerson *ptmp = _person;
23 _person = nullptr;
24 delete ptmp;
25 }
26 }
27
28 int Adapter::Person::CallnVal()
29 {
30 return nVal;
31 }
32
33 int Adapter::Person::CallnFunc()
34 {
35 return nFunc();
36 }
37
38 unsigned int Adapter::Person::Age::get()
39 {
40 return _person->getAge();
41 }

2 #include "Person.h"
3 #include <vcclr.h>
4
5 Adapter::Person::Person(String ^ name, DateTime birth)
6 {
7 SYSTEMTIME st = { 0 };
8 st.wYear = birth.Year;
9 st.wMonth = birth.Month;
10 st.wDay = birth.Day;
11
12 pin_ptr<const TCHAR> psz = PtrToStringChars(name);
13
14 _person = new CPerson(psz, st);
15 }
16
17 Adapter::Person::~Person()
18 {
19 //System::Diagnostics::Debugger::Log(0, "Debug", "Person destructor.");
20 if (_person != nullptr)
21 {
22 CPerson *ptmp = _person;
23 _person = nullptr;
24 delete ptmp;
25 }
26 }
27
28 int Adapter::Person::CallnVal()
29 {
30 return nVal;
31 }
32
33 int Adapter::Person::CallnFunc()
34 {
35 return nFunc();
36 }
37
38 unsigned int Adapter::Person::Age::get()
39 {
40 return _person->getAge();
41 }
经过验证使用Visual Studio 2017包含头文件<vcclr.h>会有报错,可以设置修改平台工具集来编译

通过CSharp调用 |

1 using System;
2 using Adapter;
3
4 namespace ConsoleApp
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 DateTime dt = DateTime.Now;
11 dt = dt.AddYears(-50);
12 Person p1 = new Person("c++", dt);
13 Console.WriteLine("调用本地c++ dll中的类: " + p1.Age);
14 Console.WriteLine("调用本地c++ dll中的变量: " + Person.CallnVal());
15 Console.WriteLine("调用本地c++ dll中的函数: " + Person.CallnFunc());
16
17 Console.ReadLine();
18 }
19 }
20 }


参考资料详情:
https://www.codeproject.com/Articles/35041/Mixing-NET-and-native-code
https://blog.csdn.net/ganzheyu/article/details/50154705
// CPerson.cpp: 定义 DLL 应用程序的导出函数。//
#include "stdafx.h"#include "CPerson.h"
CPerson::CPerson(LPCTSTR pszName, SYSTEMTIME birth){ _birth = birth; if (pszName != nullptr) lstrcpy(_name, pszName);}
unsigned int CPerson::getAge(void){ SYSTEMTIME st; GetSystemTime(&st); UINT age = st.wYear - _birth.wYear; if (_birth.wMonth > st.wMonth || (_birth.wMonth == st.wMonth && _birth.wDay > st.wDay)) { --age; }
return age;}
PERSON_API int nVal = 20180403;PERSON_API int nFunc(void){ return 1816;}
c++本地动态连接库代码的更多相关文章
- Linux下的动态连接库及其实现机制
Linux与Windows的动态连接库概念相似,但是实现机制不同.它引入了GOT表和PLT表的概念,综合使用了多种重定位项,实现了"浮动代码",达到了更好的共享性能.本文对这些技术 ...
- Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库 本文地址:https ...
- Linux 静态链接库和动态连接库
(0)文件夹 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 Linux ...
- 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包
前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) ...
- c++调用matlab生成的Dll动态连接库
点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台: matlab 7.0(R ...
- VS2013 生成sqlite3动态连接库及sqlite3.dll的调用
一,生成sqlite3动态连接库1,去sqlite官网上下载最近的sqlite源码包,解压后得到四个文件:shell.c,sqlite3.c,sqlite3.h,sqlite3ext.h此处还需要sq ...
- C编译: 动态连接库 (.so文件)(转摘)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现算法和数据 ...
- C编译: 动态连接库 (.so文件)
转自:http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现 ...
- 在Android工程中导入外部动态连接库(so文件)
假设要导入的so文件命为libtest.so,导入的方法如下: 给工程加入Native Support,将libtest.so复制到在jni文件夹下,在Android.mk文件中,加入以下代码: in ...
随机推荐
- Shell编程之条件语句:if、case语句
Shell编程之条件语句:if.case语句 一.条件测试 1)test命令测试 2)整数值比较 ...
- 3java基础补充(今天和昨天学习内容整理)
1.java单机项目 2.JavaSE又被称为J2SE,JavaEE和JavaME类同. 3.Java特性(总结) (1)跨平台/可移植性:相同的Java代码可以在任何一个支持的平台(操作系统)上运行 ...
- vue3.0使用ant-design-vue进行按需加载原来这么简单
下载 ui库 yarn add ant-design-vue 默认是全局引入,打包后体积很大, 非常影响首屏加载速度, 按需加载 下载按需加载的插件;推荐使用cnpm cnpm install bab ...
- 第一篇 -- 安装和配置PyQt5
我的电脑环境是:Win10 + Python3.6.4 + JetBrains PyCharm 2017.3.2 x64 之前用tkinter写界面,现在学习如何用PyQt5写界面. 安装PyQt5: ...
- C++第三十九篇 -- 研究一下Windows驱动开发(二)-- 驱动程序中重要的数据结构
数据结构是计算机程序的核心,I/O管理器定义了一些数据结构,这些数据结构是编写驱动程序时所必须掌握的.驱动程序经常要创建和维护这些数据结构的实例. 一.驱动对象(DRIVER_OBJECT) 每个驱动 ...
- VUE SpringCloud 跨域资源共享 CORS 详解
VUE SpringCloud 跨域资源共享 CORS 详解 作者: 张艳涛 日期: 2020年7月28日 本篇文章主要参考:阮一峰的网络日志 » 首页 » 档案 --跨域资源共享 CORS 详解 ...
- Java学习常用链接
最全的Jenkins插件开发教程 最最最全的Jenkins插件开发教程_邪恶八进制-CSDN博客_jenkins插件开发 代理FQ工具Shadow socks https://www.blog-chi ...
- 大数据学习(02)——HDFS入门
Hadoop模块 提到大数据,Hadoop是一个绕不开的话题,我们来看看Hadoop本身包含哪些模块. Common是基础模块,这个是必须用的.剩下常用的就是HDFS和YARN. MapReduce现 ...
- 为什么说使用 Linux 系统学习 OpenGL 更方便
前言 上一篇随笔介绍了我的电脑,同时也介绍了 Ubuntu 20.10 系统的安装和美化.这一篇,我将正式开始 OpenGL 之旅.使用 Ubuntu 来进行开发,不仅仅只是因为我对 Linux 桌面 ...
- vue的项目初始化
1.创建文件 blog 2.下载安装node mongoose 3.(1)vue创建后端项目文件 vue create admin (2)vue创建前端项目文件 vue create web (3)新 ...