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++本地动态连接库代码的更多相关文章

  1. Linux下的动态连接库及其实现机制

    Linux与Windows的动态连接库概念相似,但是实现机制不同.它引入了GOT表和PLT表的概念,综合使用了多种重定位项,实现了"浮动代码",达到了更好的共享性能.本文对这些技术 ...

  2. Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库     本文地址:https ...

  3. Linux 静态链接库和动态连接库

    (0)文件夹 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 Linux ...

  4. 目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)。静态库是一个或者多个obj文件的打包

    前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”) ...

  5. c++调用matlab生成的Dll动态连接库

    点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R ...

  6. VS2013 生成sqlite3动态连接库及sqlite3.dll的调用

    一,生成sqlite3动态连接库1,去sqlite官网上下载最近的sqlite源码包,解压后得到四个文件:shell.c,sqlite3.c,sqlite3.h,sqlite3ext.h此处还需要sq ...

  7. C编译: 动态连接库 (.so文件)(转摘)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现算法和数据 ...

  8. C编译: 动态连接库 (.so文件)

    转自:http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现 ...

  9. 在Android工程中导入外部动态连接库(so文件)

    假设要导入的so文件命为libtest.so,导入的方法如下: 给工程加入Native Support,将libtest.so复制到在jni文件夹下,在Android.mk文件中,加入以下代码: in ...

随机推荐

  1. Anaconda3中的python安装新模块

    1.确认安装位置:D:\Anaconda3 2.进入: D:\Anaconda3\Scripts 3.pip install -i https://pypi.tuna.tsinghua.edu.cn/ ...

  2. PYD应用方法

    1. 'ImportError: No module named xxx' 可能是xxx.pyd所在路径不在sys.path中. 解决方法:import之前用sys.path.append()方法加入 ...

  3. SFC style CSS variable injection

    摘要 在单文件组件样式中支持使用组件状态驱动的 CSS 变量( CSS 自定义属性). 基础示例 <template> <div class="text"> ...

  4. SpringBoot 构造器注入、Setter方法注入和Field注入对比

    0. 引入 今天在看项目代码的时候发现在依赖注入的时候使用了构造器注入,之前使用过 Field 注入和 Setter 方法注入,对构造器注入不是很了解.经过查阅资料看到,Spring 推荐使用构造器注 ...

  5. PHP如何接收json数据

    以前一直在写一些网站,很少涉及到接口的东西.最近公司在做一个平台,需要往接口上发送json数据.闲话少叙,直接上干货. 在php中可以通过如下方式获取: file_get_contents(" ...

  6. python中浮点数比较判断!为什么不能用==

    问题:浮点数比较为什么不能用==来写? 答:计算机里面的数字是由二进制保存的,在计算机内部有些数字不能准确的保存,于是就保存了一个最靠近的数字. 计算机表示浮点数(float或double类型)都有一 ...

  7. 【阅读笔记】Java核心技术卷一 #1.Chapter3

    3 Java的基本程序设计结构 3.1 一个简单的 Java 应用程序(略) 3.2 注释(略) 3.3 数据类型 8种基本类型 byte,short,int,long float,double ch ...

  8. 阿里云IoT初试

    本文从概念到实战,以一个假想产品--"电子货架标签"(Electronic Shelf Label,以下简称ESL)为例,介绍基于阿里云IoT的物联网应用开发. 数据交互流程 以云 ...

  9. Intouch/ifix关于语音报警的一种设置思路

    工控项目最近升级改造,需要使用Intouch/ifix提供一个语音报警功能.这个不像先前提供的单一的声音报警,业主方要求能详细的提供某某水泵或者是某某设备故障报警,这就要求我们这边对语音解析或者基础控 ...

  10. 剑指 Offer 40. 最小的k个数

    剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:ar ...