在开发高性能或跨平台应用程序时,C#开发者经常需要调用底层的C++代码。这时,P/Invoke(Platform Invocation Services,平台调用服务)就派上了大用场。本教程将手把手教你如何使用C# P/Invoke调用C++函数,即使你是编程小白也能轻松上手!

P/Invoke是.NET提供的一种机制,允许托管代码(如C#)调用非托管代码(如C/C++编写的DLL中的函数)。通过它,你可以复用已有的C++库、调用系统API,甚至提升程序性能。
在本文中,我们将围绕C# P/Invoke教程、C#调用C++函数、C#与C++交互以及平台调用P/Invoke这四个核心关键词展开详细讲解。
首先,我们需要一个C++编写的DLL。打开Visual Studio,创建一个“动态链接库(DLL)”项目,命名为 MathLibrary。
在 MathLibrary.cpp 中写入以下代码:
// MathLibrary.cpp#include "pch.h" // 如果使用预编译头extern "C" __declspec(dllexport) int Add(int a, int b){ return a + b;}extern "C" __declspec(dllexport) void PrintMessage(const char* message){ printf("%s\n", message);}注意:extern "C" 防止C++名称修饰(name mangling),确保函数名在导出时保持不变;__declspec(dllexport) 表示该函数将被导出供外部调用。
现在切换到C#项目(例如控制台应用),使用 DllImport 属性导入刚才编译好的DLL。
using System;using System.Runtime.InteropServices;class Program{ // 导入MathLibrary.dll中的Add函数 [DllImport(@"MathLibrary.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int Add(int a, int b); // 导入PrintMessage函数,注意字符串传递方式 [DllImport(@"MathLibrary.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern void PrintMessage(string message); static void Main(string[] args) { int result = Add(5, 3); Console.WriteLine($"5 + 3 = {result}"); PrintMessage("Hello from C#!"); }}关键点说明:
CallingConvention.Cdecl:指定调用约定,必须与C++函数一致(默认C++使用Cdecl)。CharSet = CharSet.Ansi:告诉.NET将C#的string转换为C风格的char*(ANSI字符串)。确保DLL文件与C#可执行文件在同一目录下,或将其放入系统环境变量PATH中。
使用工具如 dumpbin /exports MathLibrary.dll 查看实际导出的函数名,确认是否被修饰。
检查 CharSet 设置,C++使用ANSI则用 CharSet.Ansi,使用Unicode则用 CharSet.Unicode。
通过本教程,你已经掌握了C#与C++交互的基本方法。P/Invoke虽然强大,但也需要注意内存管理、数据类型映射和调用约定等细节。建议在实际项目中封装P/Invoke调用,提高代码可维护性。
记住我们的四个SEO关键词:C# P/Invoke教程、C#调用C++函数、C#与C++交互、平台调用P/Invoke。掌握这些,你就能在.NET生态中无缝集成C++能力!
提示:对于更复杂的场景(如回调函数、结构体传递、指针操作),建议查阅微软官方文档或使用C++/CLI作为中间层。
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025125970.html