在Visual Studio 2022的WinForm中能否从C#调用C++函数?
可以实现,具体步骤如下
C#无法直接调用未编译的C源文件,需要先将C代码编译为动态链接库(DLL),再通过P/Invoke机制调用,以下是Visual Studio 2022中的完整操作流程:
步骤1:创建并编译C++ DLL项目
- 在当前解决方案中右键 → 添加 → 新项目,选择「C++ 空项目」,命名为
CppDll - 将你的C源文件移入该项目,修改代码以导出函数(避免C名字修饰问题):
#include <iostream> // 标记函数为可导出,extern "C"避免名字混淆 extern "C" __declspec(dllexport) void test() { std::cout << "test\n"; }
- 右键C++项目 → 属性,在「配置属性 → 常规」中,将「配置类型」改为「动态库(.dll)」
- 选择与C#项目一致的平台(如x64/x86),编译生成DLL文件
步骤2:在C# WinForm项目中调用DLL
- 将生成的
CppDll.dll复制到C#项目的输出目录(如bin/x64/Debug),或添加为项目现有项并设置「复制到输出目录」为「如果较新则复制」 - 在C#代码中通过
[DllImport]声明函数并调用:
using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace Fun_1 { public partial class Form1 : Form { // 声明DLL中的test函数,指定调用约定为C++默认的cdecl [DllImport("CppDll.dll", CallingConvention = CallingConvention.Cdecl)] private static extern void test(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // 直接调用C++函数 test(); } } }
关键注意事项
- 平台一致性:C++ DLL与C#项目的目标平台必须完全一致(同为x64或x86),否则会触发调用错误
- 输出查看:WinForm程序默认没有控制台窗口,若要看到
std::cout的输出,可将C#项目的「输出类型」改为「控制台应用程序」 - 调用约定:必须指定
CallingConvention.Cdecl,否则会导致栈不平衡问题
内容的提问来源于stack exchange,提问作者Runsva
相关产品推荐
相关产品推荐

