You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:37:12