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 ...
随机推荐
- JAVA 中日志的记录于使用
java中常用的日志框架 日志接口 Commons Logging Apache Commons Logging是一个基于Java的日志记录实用程序,是用于日志记录和其他工具包的编程模型.它通过其他一 ...
- python基础之列表推导式
#列表推导式 ---> 返回的是列表 for语句 效率更高# 1*1 2*2 3*3 4*4 5*5 6*6 7*7 8*8 9*9# import time# to = time.clock( ...
- dos命令的学习
打开CMD的方式 开始+系统+命令提示符 Windows+R+输入CMD 在任意的文件夹下面,按住shift+点击鼠标右键,在此处打开命令行窗口 资源管理器的地址栏前面加上CMD路径 管理员方式运行: ...
- linux系统安装+windows系统安装
linux 1.格式化U盘 打开管理员命令提示符 diskpart list disk select disk 2 clean create partition primary format fs=f ...
- Linux执行source /etc/profile报错“:command not found”
修改完 /etc/profile中的内容后,执行"立即生效"命令 "source /etc/profile"报错: :command not found :co ...
- 数据分析学习1-----matplotlib
安装:Anaconda 详细见:https://blog.csdn.net/lwplwf/article/details/79162470 使用^ThinkPad-E560:~# spyder 命令 ...
- maven之---资源过滤 在java/main/resourse/*.xml ,*.properties引用maven属性${db.username}
本文主要来源maven实战14.3 为了应对环境的变化,首先使用Maven属性将这个会发生变化的部分提取出来.在上一节的数据库配置中,连接数据库使用的驱动类,URL,用户名和密码都可能发生变化,因此使 ...
- FastAPI:一个测试人员视角的教程
前言 教程肯定谈不上了,主要还是就自己的理解分享内容而已 内容是连官方文档的基础教程都没涵盖起的 建议直接看官方文档 以个人视角来分享,希望各位通过这个可以写接口了 需要自取 完整视频链接:https ...
- CentOS 永久修改系统时间
1.查看当前系统时间 date 2.修改当前系统时间 date -s "2018-2-22 19:10:30 3.查看硬件时间 hwclock --show ...
- Netty入门(三):EventLoop
前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel IO相关: 1.Java基础(一):I/O多路复用模型及Linux中的应用 上文提到,早 ...