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

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

一、C++封装库

通过前几篇文章,我们封装了C++的动态DLL库,有Qt版的,有C++版的,当然还有介绍了Pimpl模式在SDK封装中的使用:

Qt创建SDK

VS创建SDK

Pimple在SDK封装中的应用

但是,我遇到了一个场景:需要把VS创建的DLL动态库,给C#代码来调用(并且我的动态库中还包含我的计算类)。本篇文章就介绍如何来封装,并提供调用。

 二、C#调用的方式

我们C++的项目里,经常是把算法单独封装为一个类供其他的类来调用的,这样也方便管理,但是如果我们写的这个C++算法类要封装成动态DLL库,供C#代码来调用,这时候就不能直接调用了,我们知道C#和C++时两种语言,要想让C#调用C++的库,这时候只要有个中间桥梁不久可以了。

对于此,微软提供了2种调用dll的方式,托管非托管

对于托管和非托管,可以这样简单的理解托管就是内存管理由系统管理,而不是由程序员自己来管理。而C++本身的内存管理是由程序员来控制的。

C#编写的是托管代码,所以微软提供了托管C++,托管C++用于微软的 Common Language Runtime (CLR) .NET开发,这种特殊的C++语法能够使C++程序员进行.NET开发,而不需要学一门像C#这样的新语言。托管C++和C#的特性一样,只是编程风格与C++类似,这也是微软兼顾不同语言之间的交互而做的。

而使用非托管C++的方法就是使用DllImport的方法来调用,其中DLL文件时用C语言编写的。

本片主要介绍通过非托管的方式封装动态dll库,并使用C#调用

三、封装C语言风格的库

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
{
};

EXTERN_C DLLCALCULATION_API int add(int a, int b);

EXTERN_C DLLCALCULATION_API int subtract(int a, int b);

EXTERN_C DLLCALCULATION_API int multiply(int a, int b);

EXTERN_C DLLCALCULATION_API int divide(int a, int b);

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

#include "pch.h"
#include "Calculation.h"

DLLCALCULATION_API int add(int a, int b) 
{
	return (a + b);
}

DLLCALCULATION_API int subtract(int a, int b)
{
	return (a - b);
}

DLLCALCULATION_API int multiply(int a, int b)
{
	return (a * b);
}

DLLCALCULATION_API int divide(int a, int b)
{
	return (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 int add(int a, int b);
                [DllImport("C:\\My_vs2022Project\\CalculationDLL\\x64\\Release\\CalculationDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static int subtract(int a, int b);

        [DllImport("C:\\My_vs2022Project\\CalculationDLL\\x64\\Release\\CalculationDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static int multiply(int a, int b);

        [DllImport("C:\\My_vs2022Project\\CalculationDLL\\x64\\Release\\CalculationDLL.dll", CallingConvention = CallingConvention.Cdecl)]
        public extern static int divide(int a, int b);

        static void Main(string[] args)
        {
            int a = 10;
            int b = 2;
           Console.WriteLine("a+b= " + add(a,b) );
            Console.WriteLine("a-b= " + subtract(a, b));
            Console.WriteLine("a*b= " + multiply(a, b));
            Console.WriteLine("a/b= " + divide(a, b));
            Console.WriteLine("calc end.");
            Console.ReadKey();
        }
    }
}

五、运行

运行结果如下:

 

通过以上的过程,我们封装的相当于C语言风格的代码,如果我们要是有个C++的类呢?就像代码中Calculation类,上面是个空类,如果add、subtract等函数时类Calculation的成员函数时,我们该怎么封装呢,你可以思考一下,咱们下一篇继续。

上一篇:VS2022中创建C++SDK库(dll动态库)并调用SDK库(dll动态库)

下一篇:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/12978.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ入门

AMQP AMQP(Advanced Message Queuing Protocol,高级消息队列协议) 是进程之间传递异步消息的网络协议。 AMQP工作过程 发布者(Publisher)发布消息(Message),经过交换机(Exchange),交换机根据路由规则将收到消息分发给交换机绑定的队列(Queue),最后AM…

二维数组的总结

一、时间复杂度和空间复杂度 时间复杂度和空间复杂度是衡量算法效率的两个重要指标。时间复杂度是指算法执行所需的时间,而空间复杂度是指算法执行所需的内存空间。 计算时间复杂度和空间复杂度需要分析算法中各个操作的执行次数和内存使用情况。具体的计算方法可以…

亚马逊、ebay、temu如何提升产品点击率?测评自养号解析

产品点击率对于店铺销售额的影响至关重要,尤其是在竞争越来越激烈的市场环境中,想要有销量和转化,提高产品listing点击率成为了非常关键的一环。 1. 产品主图 顾客浏览产品时,第一眼看到的就是主图,一张优质的主图更容…

CSDN博客编写教程

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

UniLM模型简单介绍

目录 一、概要 二、深入扩展 2.1 预训练任务 2.2 模型精调 一、概要 如果将基于Transformer的双向语言模型(如BERT模型中的掩码语言模型)与单向的自回归语言模型(如BART模型的解码器)进行对比,可以发现&#xff0c…

springboot+vue职称评审管理系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的职称评审管理系统。项目源码请联系风歌,文末附上联系信息 。 目前有各类成品java毕设,需要请看文末联系方式 …

[Java]监听器(Listener)

过滤器(Filter)https://blog.csdn.net/m0_71229255/article/details/130246404?spm1001.2014.3001.5501 一 : Listener监听器简述 监听器就是监听某个对象的的状态变化的组件 监听器的相关概念: 事件源: 被监听的对象 ----- 三…

(补)4.13每日一题

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 题目连接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/ 解题 开始我把这个题目想简单了,我想的是输入一个字符串,从第一…

【系统集成项目管理工程师】项目整体管理

💥十大知识领域:项目整体管理 项目整体管理包括以下 6 个过程: 制定项目章程定项目管理计划指导与管理项目工作监控项目工作实施整体变更控制结束项目或阶段过程 一、制定项目章程 制定项目章程。编写一份正式文件的过程,这份文件就是项目章程…

pushmall推贴共享电商2023年4月计划

Pushmall推贴共享电商2023年4月计划 2023年 二月份优化完成 1、商圈套餐卡:商品、优惠券、活动优化; 2、会员预充值一卡通:指定商家会员卡充值优惠; 3、商家海报:店铺海报、商品海报、商圈卡海报优化。 4、首页重新布…

MLCC周期性分析:当前时点处于周期反转前夜

MLCC是电子工业大米,供需波动导致行业成周期性波动 MLCC是最常用的被动元器件之一,终端下游涵盖消费电子、家电、汽车、通信等。在5g、汽车电子、智能硬件的推动下,MLCC行业需求稳步增长。供给端来看,中国大陆厂商合计市场份额不…

数据要素化全面提速,数据复制将迎来春天?

数据复制市场将迎来真正的春天? 目前看的确如此。近日,国家发改委密集发文,从产权、分配、流通、安全等多个角度解读“数据二十条”( 《中共中央国务院关于构建数据基础制度更好发挥数据要素作用的意见》,简称“数据二…

Bots攻击威胁石油石化企业 瑞数动态安全实现从“人防”到“技防”

近日,中国石油石化企业信息技术交流大会暨油气产业数字化转型高峰论坛在京召开。本届大会由中国石油学会、中国石油、中国石化、中国海油、国家管网、国家能源、中国中化、中国航油、延长石油、中国地质调查局等单位共同主办。 作为我国石油石化行业的盛会&#xf…

什么是设计模式?

目录 常见的设计模式 创建型模式 结构型模式 行为型模式 总结 设计模式(Design Pattern)是一些被认为是最佳实践的面向对象编程经验的总结,它们提供了解决特定场景问题的可复用方案。设计模式可以加速开发过程并提高代码质量和可读性&…

GFD233A 3BHE022294R0103

GFD233A 3BHE022294R0103 ABB KUC321AE PLC模块 HIEE300698R0001 KU C321 AE01 ABB KUC711 3BHB004661R0001 高压变频模块 KUC711AE ABB KUC755AE105 3BHB005243R0105 驱动控制系统模块 KUC755 ABB KUC755AE106 3BH005243R006 控制系统模块 KU C755 AE 106 ABB LDGRB-01 3BSE01…

【C语言】基础语法1:变量和数据类型

下一篇:运算符和表达式 ❤️‍🔥前情提要❤️‍🔥   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发…

知乎版ChatGPT「知海图AI」加入国产大模型乱斗,称效果与GPT-4持平

“2023知乎发现大会”上,知乎创始人、董事长兼CEO周源和知乎合作人、CTO李大海共同宣布了知乎与面壁智能联合发布“知海图AI”中文大模型。 周源据介绍,知乎与面壁智能达成深度合作,共同开发中文大模型产品并推进应用落地。目前,知…

vue 报错 error:03000086:digital envelope routines::initialization error解决方案

目录 1. 引言: 2. 更换版本出现问题: 3. 出现原因: 4. 解决办法: -> 4. 1 删了 再换回16.15版本 -> 4.2 指令修改(好使) ---> 4.2.1效果如图 -> 4.3 其他指令就别试了 压根不好使 1. 引言: npm出现问题 , 卸载后 装了个新node 18.15版本 2. 更换版本…

JavaScript【三】JavaScript中的数组

文章目录 🌟前言🌟数组🌟声明:🌟 隐式创建:🌟 实例化构造函数: 🌟 注意:一个值为数组的长度。🌟 访问:🌟 遍历&#xff1a…

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(Eureka、Ribbon)

微服务技术栈导学 微服务技术是分布式架构(把服务做拆分)的一种 而springcloud仅仅是解决了拆分时的微服务治理的问题,其他更复杂的问题并没有给出解决方案 一个完整的微服务技术要包含的不仅仅是springcloud 微服务技术栈 包括什么 …