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);};
二、思路
不知道大家还记得设计模式中的单例模式吗?
我们可以采用类似的处理方式,通过创建一个实例函数指针的方式,来通过这个实例作为一个参数来调用累的成员函数。
如下所示:
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_EXPORTSclass 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 informationusing 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),未经作者授权同意,请勿转载。