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

这篇具有很好参考价值的文章主要介绍了C#调用C++封装的SDK库(dll动态库)——下。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

 二、思路

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

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

如下所示:

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

三、创建动态DLL

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

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

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

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

在项目中添加一个Calculation类。

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

 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++封装的SDK库(dll动态库)——下

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

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

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

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

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

 在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),未经作者授权同意,请勿转载。文章来源地址https://www.toymoban.com/news/detail-424898.html

到了这里,关于C#调用C++封装的SDK库(dll动态库)——下的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++动态调用dll

    在C++中动态调用DLL(动态链接库)可以使用Windows API函数。以下是一个简单的示例,演示如何动态加载和调用DLL中的函数: 在上面的示例中,我们首先使用LoadLibrary函数加载DLL。然后,使用GetProcAddress函数获取要调用的函数的指针。在本例中,我们假设要调用的函数名为\\\"MyFu

    2024年01月24日
    浏览(35)
  • C++调用C# dll成功示例

    一.准备C# dll类库 。生成CSLib.dll  二、写C++应用调用  1)需要把dll复制到运行目录下。(不然会提示找不到dll System.IO.FileNotFoundException:“未能加载文件或程序集“CSLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件) 2)设置\\\"公共语言运

    2024年02月14日
    浏览(60)
  • C#调用C++ dll异常排查

    最近在做的一款程序,长时间运行总会出现莫名的问题。有时是自动关闭,有时程序报错,有时调用的dll异常…… 由于开始与C++组合作时,使用其提供的dll出现过数据读写时异常(内存操作异常),于是怀疑他们提供的dll有内存泄漏。于是想通过日志或其它方法来确认这个猜

    2024年01月21日
    浏览(54)
  • C#调用C++类,托管C++方式实现(创建C++ CLR dll项目)

            由于C#编写的是托管代码,编译生成微软中间语言,而C++代码则编译生成本地机器码(这种C++也有叫做本地C++或者非托管C++,VC6.0就是用于开发非托管C++代码的平台),这两种语言进行混合编程就存在一定困难。比较常用的方法是使用DllImport的方法,这种方法在网

    2024年02月07日
    浏览(46)
  • c#调用matlab生成的COM DLL,Matlab GUI程序封装成exe文件并在不安装Matlab的电脑上运行

    最近根据需求用Matlab写了一个简单的软件,但需要安装到其他电脑上运行,倒腾了很久最终成功在其他电脑上运行,现将方法共享给大家。 安装方法: ①程序封装 首先用Matlab写完程序并封装好(我用的是Matlab2018b,封装的时候就用matlab自带的APP封装程序就好[就是黑框框那个

    2024年01月22日
    浏览(49)
  • [Python] 如何通过ctypes库来调用C++ 动态库 DLL?

    ctypes是Python的一个外部库,它提供了一种灵活的方式来调用C语言的动态链接库(DLL)或共享库(SO)。通过ctypes,我们可以在Python中直接调用 C语言编写的函数和变量 ,从而实现跨语言的互操作。 ctypes 它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模

    2024年01月19日
    浏览(38)
  • C#调用C++动态库

    在C#开发过程中,我们可能会遇到需要调用Windows API 或是第三方库的场景,然而有时候这些库是由C++编写的,并不能直接应用在C#的程序中,这为开发带来许多阻力。本文介绍两种使用C#调用C++动态库的方式,以及在这个过程中可能遇到的问题,看完之后会对你的困境有所帮助

    2024年02月16日
    浏览(29)
  • VS2022环境下C++ DLL动态链接库的编写和调用

    1、新建动态链接库项目 2、新建类 3、宏定义 4、使用宏定义修饰类 调用DLL动态链接库大致有两种方法: 一种是“隐式调用”,需要.h头文件、.lib符号文件、.dll动态库文件; 一种是“显示调用”,需要.dll动态库文件; 此处介绍第一种调用方式。 1、创建项目 2、项目属性

    2024年02月14日
    浏览(49)
  • stable-diffusion.cpp 一个文件解决stable diffusion所有环境,不需要python,stable-diffusion.dll动态库C#调用Demo

    stable-diffusion.cpp 一个文件解决stable-diffusion所有环境,不需要python,stable-diffusion.dll动态库C#调用Demo 目录 介绍 效果 Text To Image Image To Image Upscale 项目 代码 Native.cs SDHelper.cs MainForm.cs 下载  stable-diffusion.cpp 地址:https://github.com/leejet/stable-diffusion.cpp StableDiffusionSharp 地址:https://

    2024年04月14日
    浏览(48)
  • C#生成dll给c++调用 方法二COM方式 vs2022 NO Make Assembly COM-Visible选错了 不需要clr

    有些C++项目中也用了C语言.c,用方法一就无法使用【不能使用 /clr 选项编译 C 文件】。就用方法2。  参考:  https://www.5axxw.com/questions/content/2ozion  1.C# 生成dll     编译正常,C# dll就完成了。 2.C++调用示例

    2024年02月14日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包