在C#中调用C++编写的DLL(动态链接库)
在C#中调用C++编写的DLL:P/Invoke方案详解
在C#开发中,调用C++编写的动态链接库(DLL)是常见的需求,主要有两种方法:P/Invoke和C++/CLI。P/Invoke适用于调用非托管DLL(如纯C/C++生成的DLL),它需要手动声明函数签名,灵活性高但需注意平台一致性和调用约定。C++/CLI则适用于调用托管DLL(通过C++/CLI封装的DLL),代码更简洁但需额外创建中间层项目。本指南将重点介绍第一种方案——使用P/Invoke,提供完整的步骤和代码示例,确保格式清晰美观。
方法概述
- P/Invoke:通过C#声明外部方法调用非托管DLL,需处理函数签名、平台一致性等细节。
- C++/CLI:创建托管中间层项目,可直接在C#中添加引用,代码更简洁(本指南不展开)。
P/Invoke的核心优势在于直接控制底层调用,适合性能敏感场景。下面分步详解从创建C++ DLL到C#调用的完整流程。
使用P/Invoke详解
P/Invoke是C#调用非托管代码(如C++ DLL)的标准方式。它通过在C#代码中使用DllImport
特性声明外部方法实现。以下是具体步骤,确保平台一致性(如x64)是关键。
步骤1: 创建C++ DLL项目
-
打开Visual Studio:启动VS,创建新项目。
-
选择“动态链接库(DLL)”模板。
-
-
项目路径示例:
D:\Gensen\TestDll\
(仅供参考)。 -
-
-
添加源文件:
- 在解决方案资源管理器中,右击“源文件”文件夹。
- 选择“添加”->“新建项”,创建C++类文件(如
FourArith.cpp
)。
-
设置平台:
-
导航到菜单栏:生成->配置管理器。
-
-
设置“活动解决方案平台”为x64(重要:确保与后续C#项目一致)。
-
确认配置为Debug或Release(推荐Debug用于测试)。
-
步骤2: 编写C++代码
在C++文件中,添加四则运算函数。使用extern "C"
防止C++编译器对函数名进行修饰(如?Add@@YANNN@Z
),确保C#能通过函数名正确匹配。省略extern "C"
需在C#中指定EntryPoint,但复杂易出错,不推荐。
代码示例(FourArith.cpp
):
#include "pch.h"
#include "FourArith.h"
extern "C" _declspec(dllexport) double Add(double a, double b);
extern "C" _declspec(dllexport) double Sub(double a, double b);
extern "C" _declspec(dllexport) double Multi(double a, double b);
extern "C" _declspec(dllexport) double Divi(double a, double b);
double Add(double a, double b) {
return a