C#调用C++编写的DLL(非托管)

11 篇文章 1 订阅
10 篇文章 0 订阅

前言
我之前有过一个函数使用C++写的,我想将它加到C#里面.
那么,本篇博客就以实用的角度出发,介绍如何将C++编写的DLL供给C#调用。
首先,托管与非托管的区别请看以下博客:
我是传送门
DLL(动态链接库)的各个C++关键字的介绍请看以下博客:
我是传送门
上面顺便介绍了静态链接库与动态链接库的区别。
C++调用C++编写的DLL请看下述博客
我是传送门

本博客也顺便介绍下如何C++编写DLL。
首先,打开VS2019后,在C++选择DLL,
在这里插入图片描述
你可以命名为DLL_CPP
之后,该库项目会有四个文件,
两个头文件 pch.h framework.h
两个源文件 pch.cpp dllmain.cpp

在这里插入图片描述

看到这里相信你看过前面链接里的原理后已经弄懂各个关键字以及各个文件的意义了。
在头文件 pch.h 下添加你的函数声明:
即:
pch.h

// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"

#endif //PCH_H

 //_declspec(dllimport) //指的是允许将其给外部调用


extern "C" _declspec(dllimport) int add(int a, int b);
extern "C" _declspec(dllimport) int minus(int a, int b);
extern "C" _declspec(dllimport) int multiply(int a, int b);
extern "C" _declspec(dllimport) double divide(int a, int b);

有四个函数被添加在里面,
然后再在pch.cpp里实现该函数:
即:

// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"

// 当使用预编译的头时,需要使用此源文件,编译才能成功。
int add(int a, int b)
{
	return a + b;
}

int minus(int a, int b)
{
	return a - b;
}

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

double divide(int a, int b)
{
	double m = (double)a / b;
	return m;
}

ctrl+B 编译一下。
然后进入到该项目的DeBug文件夹下,就可以看到该DLL文件了。
在这里插入图片描述
在这里插入图片描述
就是那个DLL_CPP.dll

新建一个测试用的C# 控制台程序 TEST_DLL:
在这里插入图片描述
把DeBug平台改为X86。
ctrl + B编译一下,
找到该C#控制台项目 x86/DeBug下,把上面的那个DLL_CPP.dll 复制进去。
在这里插入图片描述
在该C#项目下新建一个类文件UseCppDll.cs,以后你要使用它的函数:
名称空间改不改都可以。
引入名称空间: using System.Runtime.InteropServices;
输入以下代码:
在这里插入图片描述
函数体前一定要有static 或者 extern
回到Program.cs 下的主函数里,
输入如下代码,即可调用C++ 的DLL里的函数了,其实调用的是C++ 的非托管的函数代码。
在这里插入图片描述
你也可以把函数签名换成其他函数,或者你可以调用很多函数。
好啦,结束。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值