C#调用C++封装的SDK库(dll动态库)——下

2023-11-13

C#调用C++封装的SDK库(dll动态库)——下

一、说明

上一篇我们相当于封装的是C语言风格的动态dll库,供C#来调用的。

C#调用C++封装的SDK库(dll动态库)——上

如果我们要封装的是下面的类呢?我们该怎么办?大家先思考下。


class Calculation
{
public:
    Calculation();

    int add(int a, int b);
 
    int subtract(int a, int b);
 
    int multiply(int a, int b);
 
    int divide(int a, int b);
    
};
 

 二、思路

不知道大家还记得设计模式中的单例模式吗?

我们可以采用类似的处理方式,通过创建一个实例函数指针的方式,来通过这个实例作为一个参数来调用累的成员函数。

如下所示:

Calculation* getCalculation();
int add(Calculation* pCalculation, int a, int b);

三、创建动态DLL

1、我们创建一个DLL的动态库工程,命名CalculationDLL。

在项目中添加一个Calculation类。

 Calculation.h头文件添加如下代码:

#pragma once
 
#ifdef DLLCALCULATION_EXPORTS
#define DLLCALCULATION_API __declspec(dllexport)
#else
#define DLLCALCULATION_API __declspec(dllimport)
#endif // DLLCALCULATION_EXPORTS
 
 
class Calculation
{
public:
    Calculation();

    int add(int a, int b);
 
    int subtract(int a, int b);
 
    int multiply(int a, int b);
 
    int divide(int a, int b);
    
};

EXTERN_C DLLCALCULATION_API Calculation* getCalculation();

EXTERN_C DLLCALCULATION_API void destructorCalculation(Calculation* pCalculation);
 
EXTERN_C DLLCALCULATION_API int add(Calculation* pCalculation, int a, int b);
 
EXTERN_C DLLCALCULATION_API int subtract(Calculation* pCalculation, int a, int b);
 
EXTERN_C DLLCALCULATION_API int multiply(Calculation* pCalculation, int a, int b);
 
EXTERN_C DLLCALCULATION_API int divide(Calculation* pCalculation, int a, int b);

Calculation.cpp文件添加如下代码:

#include "pch.h"
#include "Calculation.h"
 
Calculation::Calculation()
{
}

int Calculation::add(int a, int b) 
{
	return (a + b);
}
 
int Calculation::subtract(int a, int b)
{
	return (a - b);
}

int Calculation::multiply(int a, int b)
{
	return (a * b);
}
 
int Calculation::divide(int a, int b)
{
	return (a / b);
}

DLLCALCULATION_API Calculation* getCalculation()
{
    return new Calculation();
}

DLLCALCULATION_API void destructorCalculation(Calculation* pCalculation)
{
    if( pCalculation )
    {
        delete pCalculation;
        pCalculation = NULL;
    }
}
 
DLLCALCULATION_API int add(Calculation* pCalculation, int a, int b)
{
    return pCalculation->add(a,b);
}
 
DLLCALCULATION_API int subtract(Calculation* pCalculation, int a, int b)
{
    return pCalculation->subtract(a,b);
}
 
DLLCALCULATION_API int multiply(Calculation* pCalculation, int a, int b)
{
    return pCalculation->multiply(a,b);
}
 
DLLCALCULATION_API int divide(Calculation* pCalculation, int a, int b)
{
    return pCalculation->divide(a,b);
}

在属性页,C/C++->预处理器->预处理器定义,添加DLLCALCULATION_EXPORTS

 四、创建C#控制台调用项目

创建一个C#的控制台项目:

 在Program.cs中输入下面的调用代码:

// See https://aka.ms/new-console-template for more information
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
using System.Runtime.InteropServices;
 
namespace ConsoleApp1
{
    class Program
    {

[DllImport("C:\\My_vs2022Project\\CalculationDLL\\x64\\Release\\CalculationDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static IntPtr getCalculation();
                [DllImport("C:\\My_vs2022Project\\CalculationDLL\\x64\\Release\\CalculationDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static void destructorCalculation(IntPtr pCalculation);
        [DllImport("C:\\My_vs2022Project\\CalculationDLL\\x64\\Release\\CalculationDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static int add(IntPtr pCalculation, int a, int b);
                [DllImport("C:\\My_vs2022Project\\CalculationDLL\\x64\\Release\\CalculationDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static int subtract(IntPtr pCalculation, int a, int b);
 
        [DllImport("C:\\My_vs2022Project\\CalculationDLL\\x64\\Release\\CalculationDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static int multiply(IntPtr pCalculation, int a, int b);
 
        [DllImport("C:\\My_vs2022Project\\CalculationDLL\\x64\\Release\\CalculationDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static int divide(IntPtr pCalculation, int a, int b);
 
        static void Main(string[] args)
        {
            IntPtr pCalculation = getCalculation();
            
            int a = 10;
            int b = 2;
            Console.WriteLine("a+b= " + add(pCalculation, a, b));
            Console.WriteLine("a-b= " + subtract(pCalculation, a, b));
            Console.WriteLine("a*b= " + multiply(pCalculation, a, b));
            Console.WriteLine("a/b= " + divide(pCalculation, a, b));
            
            destructorCalculation(pCalculation);

            Console.WriteLine("calc end.");
            Console.ReadKey();
        }
    }
}

好了,你可以运行看看效果了。

上一篇:C#调用C++封装的SDK库(dll动态库)——上

本文原创作者:冯一川(ifeng12358@163.com),未经作者授权同意,请勿转载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#调用C++封装的SDK库(dll动态库)——下 的相关文章

随机推荐

  • android studio调整代码和菜单栏字体大小

    1 File Settings Appearance Behavior Appearance 右边Override default fonts by not recommended 2 设置代码大小 File Settings Editor
  • 微信小程序组件知识点GET

    1 可滚动视图区域组件scroll view 在滚动 scroll view 时会阻止页面回弹 所以在 scroll view 中滚动 是无法触发下拉刷新事件 onPullDownRefresh 所以如果一定要使用下拉刷新 请使用页面的滚动
  • Clickhouse建表语法、视图语法、数据表DDL(数据定义语言)、数据DML(数据操作语言)...

    参考官网 https clickhouse tech docs zh sql reference statements create 更多详细文档可以参考官网 强烈推荐 1 Clickhouse创建数据库 CREATE DATABASE 该
  • 大年初四晚,Flutter Forward 中国社区直播活动与你不见不散!

    之前我们预告过 2023 年 1 月 25 日 年初四 Flutter 团队将在肯尼亚首都内罗毕举办 Flutter Forward 大会 并同时开启线上直播 本次活动将为展示最新的 Flutter 技术更新 包括一个主题演讲 以及多个技术
  • windows运行Elasticsearch内存占用过大

    运行Elasticsearch 内存占用差不多10G 编辑 elasticsearch 7 17 3 config jvm options文件 修改堆内存大小为4G Xms4g Xmx4g
  • Cisco Packet Tracer下载和安装、构建网络拓扑、配置网络设备、跟踪数据包、查看数据包

    Cisco Packet Tracer下载和安装 构建网络拓扑 配置网络设备 跟踪数据包 查看数据包 下载 一 注册Cisco账户 网址 https www cisco com c en us index html 二 注册Cisco学院的
  • CVPR 2023

    Title InternImage Exploring Large Scale Vision Foundation Models with Deformable Convolutions Paper https arxiv org abs
  • Matlab之colormap, FaceVertexCData

    首先说说colormap 它提供了一种着色方案 我认为它有3个作用 1 Matlab内置多种样式的color map 在任一个Figure中 打开菜单 Edit gt ColorMap 弹出 Colormap Editor 界面 在该界面上
  • linux 驱动——高级字符驱动程序操作

    内容 ioctl 的 ioctl 的系统概念 与用户空间同步的方法 进程休眠 非阻塞IO及与用户间的通信 原型函数 int ioctl struct inode inode struct file filp unsigned int cmd
  • week4作业题_A-DDL的恐惧

    A DDL的恐惧 题目描述 ZJM 有 n 个作业 每个作业都有自己的 DDL 如果 ZJM 没有在 DDL 前做完这个作业 那么老师会扣掉这个作业的全部平时分 所以 ZJM 想知道如何安排做作业的顺序 才能尽可能少扣一点分 请你帮帮他吧
  • 数据结构学习笔记(一)线性表

    文章目录 前言 一 线性表是什么 线性结构 线性表 二 线性表的顺序表示和实现 1 什么是线性表的顺序表示 2 代码实现 总结 参考资料 前言 文章目的在于记录学习数据结构这门课程中遇到的知识点以及难点 为解决或优化实际代码问题打好基础 一
  • 辨析BigDecimal的toString()方法和toPlainString()方法

    辨析BigDecimal的toString 方法和toPlainString 方法 toString toString方法会将BigDecimal的值以科学计数方式的字符串 但是转换成科学计数的方式也是有场景的 并不是所有的值都会转为科学计
  • Nginx 代理解决跨域问题分析

    当你遇到跨域问题 不要立刻就选择复制去尝试 请详细看完这篇文章再处理 我相信它能帮到你 分析前准备 前端网站地址 http localhost 8080 服务端网址 http localhost 59200 首先保证服务端是没有处理跨域的
  • Android注册登录页面

    Android注册登录页面 需求 分析 项目目录 java domain JsonBean java UserInfo java utils GetJsonDataUtil java Login java MainActivity java
  • 前端实现预览功能,播放rtsp视频流(node.js+ffmpeg+flv.js)

    实现思路 获取摄像头rtsp流 通过node js ffmpeg转码 通过哔哩哔哩flv js播放 1 获取摄像机RTSP流 之前文章有说明不多阐述 2 配置流媒体服务器 1 下载安装node js 运行node js 网上教程很多自行下载
  • XGBoost-工程实现与优缺点(中)

    工程实现 块结构设计 我们知道 决策树的学习最耗时的一个步骤就是在每次寻找最佳分裂点是都需要对特征的值进行排序 而 XGBoost 在训练之前对根据特征对数据进行了排序 然后保存到块结构中 并在每个块结构中都采用了稀疏矩阵存储格式 Comp
  • 为什么MVC不是一种设计模式

    比较Backbone和Ext4 x在MVC实现上的差异 大漠穷秋 前言 圣人云 不想做妈咪的小姐不是好码农 每一个码农的心中都有一个终极理想 那就是有一天不用再Coding 在成为妈咪的道路上 设计模式 被认为是一项必备的技能 因此 经常有
  • python sys.path.append()和sys.path.insert()的作用与区别

    python程序中使用 import XXX 时 python解析器会在当前目录 已安装和第三方模块中搜索 xxx 如果都搜索不到就会报错 使用sys path append 方法可以临时添加搜索路径 方便更简洁的import其他包和模块
  • Eclipes下载并且导入GitHub中的maven项目

    第一步 确保eclipse装有git和maven插件 最新的eclipse不需要下载应该都集成了这些基本的功能 如果没有这两个插件自己下载安装 第二步 下载GitHub项目 拷贝想要下载的项目URL eclipse gt gt gt Fil
  • C#调用C++封装的SDK库(dll动态库)——下

    C 调用C 封装的SDK库 dll动态库 下 一 说明 上一篇我们相当于封装的是C语言风格的动态dll库 供C 来调用的 C 调用C 封装的SDK库 dll动态库 上 如果我们要封装的是下面的类呢 我们该怎么办 大家先思考下 class C