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. python mysql类

    import pymysql class MysqlHelper(object): conn = None def __init__(self, host, username, password, d ...

  2. Python语言的技术领域

    第一部分:各个领域应用的语言 大家看这个内容,其实你很明显发现,其实各个语言都有他的用处.我们可以说Python是应用最广的.但是暂时还是不能说它是全能的,因为他也有它的短板,但是对于一般的小公司和小 ...

  3. POJ 尺取法

    poj3061 Subsequence 题目链接: http://poj.org/problem?id=3061 挑战P146.题意:给定长度为n的数列整数a0,a1,...,a(n-1)以及整数S, ...

  4. UI作品评审总结:切忌过度设计,注意设计闭环

    本期,我们一起看看学长认证模块--UI同学的作品评审.   拿好小板凳,做好笔记,我们开始吧!     我们拿了两个典型的作品进行了一个讲解,做的特色都还不错,但是都有些小问题.   先来看一下第一位 ...

  5. React组件三大属性之state

    React组件三大属性之state 组件被称为"状态机", 页面的显示是根据组件的state属性的数据来显示 理解1) state是组件对象最重要的属性, 值是对象(可以包含多个数 ...

  6. 记一次.Net5接入支付宝SDK的小插曲

    由于业务需求,在项目里面要接入支付宝的支付功能,于是在github上找到了支付宝的官方sdk:https://hub.fastgit.org/alipay/alipay-easysdk 先说问题: 在 ...

  7. java对接c++发布的webservice接口,其中参数类型有base64Binary格式(无需将图片数据转化为c++中的结构体)

    接口名称: std::string SendVehiclePass(std::string VehiclePassInfo, struct xsd__base64Binary PlatePicData ...

  8. 记一次 .NET 某云采购平台API 挂死分析

    一:背景 1. 讲故事 大概有两个月没写博客了,关注我的朋友应该知道我最近都把精力花在了星球,这两个月时间也陆陆续续的有朋友求助如何分析dump,有些朋友太客气了,给了大大的红包,哈哈,手里面也攒了1 ...

  9. Python基础之用tkinter写界面

    参考链接:https://blog.csdn.net/qq_37482202/article/details/84201259 Tkinter介绍 Tkinter(也叫Tk接口)是Tk图形用户界面工具 ...

  10. SQL Challenges靶机

    http://www.zixem.altervista.org/SQLi/ 第一关 http://www.zixem.altervista.org/SQLi/level1.php?id=1 and 1 ...