一、目的
本文主要记录一下C#最简单的调用C++编写的动态库的一种方式,也是本人常用的一种方式,把核心逻辑用C/C++封装成DLL,然后基于CLR给这些DLL再做一个封装后,直接供C#使用,这样做,还有一个目的,就是保证核心代码不会被轻易的反编译,毕竟C#写的应用程序还是比较容易的用ILSpy直接逆向回源码的。
二、C++ DLL项目的创建与生成
1. 打开VS2019, 创建一个C++空项目
项目名称命名为CppDLL, Solution名称命名为CombineCppAndCSharp,并切换到文件夹视图,如下:
2. 在CppDLL中新建src文件夹,并新建CppDLL.h 和CppDLL.cpp
代码如下:
CppDLL.h, 这里要注意的是_declspec(dllexport) 因为此类要导出成DLL,所以需要加入此windows DLL导出规约
这个类很简单,就是计算斐波那契数列,后面我们再用C#编写一个同样的函数,顺便比较一下两种语言的工作效率。
#pragma once
#include <iostream>
class _declspec(dllexport) CppDLL
{
private:
int m_num;
int Fib(int n);
public:
CppDLL(int m) :m_num(m) {};
//禁止copy构造和赋值构造
CppDLL(const CppDLL&) = delete;
CppDLL& operator=(const CppDLL&) = delete;
int GetFib();
};
CppDLL.cpp, 这里不需要太多解释了。
#include "CppDLL.h"
int CppDLL::Fib(int n)
{
if (n<2)
{
return n;
}
else
{
return Fib(n - 2) + Fib(n - 1);
}
}
int CppDLL::GetFib()
{
return Fib(m_num);