C#调用C++编写的DLL(非托管)
Posted _我爱西红柿炒鸡蛋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#调用C++编写的DLL(非托管)相关的知识,希望对你有一定的参考价值。
前言
我之前有过一个函数使用C++写的,我想将它加到C#里面,用C#调用。结果我看了好多博主的博客,成功的把上面的坑一个一个都踩过了。(小声吐槽,话说这些博主不看自己的东西能不能跑起来吗。。。)
那么,本篇博客就以实用的角度出发,介绍如何将C++编写的DLL供给C#调用。
首先,托管与非托管的区别请看以下博客:
托管DLL和非托管DLL的区别 - 任飞儿 - 博客园 (cnblogs.com)
DLL(动态链接库)的各个C++关键字的介绍请看以下博客:
C++类库开发详解 - 奔跑的小河 - 博客园 (cnblogs.com)
上面顺便介绍了静态链接库与动态链接库的区别。
C++调用C++编写的DLL请看下述博客
(24条消息) VisualStudio2019 DLL生成并使用教程(C++)最详细Demo教程_Yfw的博客-CSDN博客
本博客也顺便介绍下如何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++ 的非托管的函数代码。
你也可以把函数签名换成其他函数,或者你可以调用很多函数。
好啦,结束。
以上是关于C#调用C++编写的DLL(非托管)的主要内容,如果未能解决你的问题,请参考以下文章