当前位置:首页 > C# > 正文

C#调用C++动态链接库(DLL)详解(从零开始掌握P/Invoke互操作技术)

在实际开发中,我们经常会遇到需要在C#项目中调用C++编写的高性能模块或已有C++库的情况。这时候,就需要使用C#调用C++动态链接库(DLL)的技术。本文将手把手教你如何通过P/Invoke(平台调用)机制实现这一目标,即使你是编程小白也能轻松上手!

C#调用C++动态链接库(DLL)详解(从零开始掌握P/Invoke互操作技术) C#调用C++ DLL  C#与C++互操作 P/Invoke教程 动态链接库调用 第1张

一、什么是P/Invoke?

P/Invoke(Platform Invocation Services)是.NET提供的一种机制,允许托管代码(如C#)调用非托管代码(如C/C++编写的DLL)。它是实现C#与C++互操作的核心技术。

二、准备工作

要完成本教程,你需要:

  • Visual Studio(建议2019或更高版本)
  • 基本的C#和C++语法知识
  • 了解动态链接库(DLL)的基本概念

三、创建C++动态链接库(DLL)

首先,我们用C++编写一个简单的DLL,包含一个加法函数。

  1. 打开Visual Studio,创建新项目 → 选择“动态链接库(DLL)”(C++)
  2. 将项目命名为 MathLibrary

修改 MathLibrary.cpp 文件如下:

// MathLibrary.cpp#include "pch.h" // 如果使用预编译头extern "C" __declspec(dllexport) int Add(int a, int b){    return a + b;}

关键点说明:

  • extern "C":防止C++名称修饰(name mangling),确保函数名在DLL中保持原样
  • __declspec(dllexport):导出函数,使其可被外部调用

编译后,你会在输出目录(如Debug或Release)得到 MathLibrary.dll 文件。

四、在C#中调用C++ DLL

接下来,我们创建一个C#控制台应用程序来调用刚才生成的DLL。

  1. 新建C#控制台应用(.NET Framework 或 .NET Core/.NET 5+ 均可)
  2. MathLibrary.dll 复制到C#项目的输出目录(通常是 bin\Debug\net6.0 等)

在C#代码中使用 DllImport 导入函数:

using System;using System.Runtime.InteropServices;class Program{    [DllImport("MathLibrary.dll", CallingConvention = CallingConvention.Cdecl)]    public static extern int Add(int a, int b);    static void Main(string[] args)    {        int result = Add(10, 20);        Console.WriteLine($"10 + 20 = {result}");        // 输出:10 + 20 = 30    }}

注意:

  • DllImport 指定要加载的DLL名称
  • CallingConvention.Cdecl 必须与C++函数的调用约定一致(C++默认为Cdecl)
  • 函数签名必须完全匹配(参数类型、返回值类型)

五、常见问题与解决方案

1. 找不到DLL:确保DLL文件在可执行文件同目录下,或在系统PATH路径中。

2. 入口点未找到:检查C++是否使用了 extern "C",并确认函数名拼写正确。

3. 调用约定不匹配:C++默认是 Cdecl,而C#默认是 StdCall,务必显式指定 CallingConvention.Cdecl

六、总结

通过本教程,你已经掌握了如何使用P/Invoke教程中的核心方法,在C#中成功调用C++编写的动态链接库调用。这项技能在集成高性能计算模块、调用硬件驱动或复用遗留C++代码时非常有用。

记住:C#调用C++ DLL的关键在于函数导出方式、调用约定匹配以及数据类型的正确映射。多加练习,你就能熟练运用这一强大的互操作技术!