VS2022 winform调用cpp
使用VS2022,在C#Winform中执行cpp代码。
一些废话:
这个学期的openCV大作业要求使用QT或者winform做成一个界面,但是实现代码需要使用cpp,使用QT固然方便,但是需要下载QT,但是电脑有点问题,C盘天天蹦迪不太敢下新软件(软件都在D盘里,D盘也不太够了),而且……好吧说白了就是懒得下新东西(
所以就在到处找怎么做,但是人比较菜,找到的要么版本不对看不懂,要么要下新东西,本来就是不想下新东西才使用winform的嘛,就开始求助万能的deepseek,最后发现非常之简单……
接下来就开始咯~
基础准备:
看看VS里面有没有这些东西……

准备就绪……
打开VS2022,创建一个新项目,语言选择C++,搜索模板 动态链接库(DLL) ,然后取个名字,放在一个文件夹里。

创建好了之后,在解决方案资源管理器中,右键项目,选择添加(D) -> 新建项(W)->选择头文件(.h),然后随便取一个名字,我这取的是openCV_test.h
然后再在新建项里,选择C++文件(cpp),名字要和头文件取名一样。


ps:如果打开如果是紧凑视图,就点击显示所有模板(T)

接下来就开始编写动态库程序啦
头文件代码如下:
#pragma once
#include <opencv2/opencv.hpp>
// 定义导出宏,确保在DLL中正确导出函数
#ifdef OPENCVTEST_EXPORTS
#define OPENCVTEST_API __declspec(dllexport)
#else
#define OPENCVTEST_API __declspec(dllimport)
#endif
extern "C" {
OPENCVTEST_API void ProcessImage(const char* inputPath, const char* outputPath);
}
接下来在cpp文件中实现函数功能
#include "opencv_test.h" // 加入刚编写的头文件
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
/// <summary>
/// 转化为灰度图
/// </summary>
/// <param name="inputPath">源图路径</param>
/// <param name="outputPath">保存路径</param>
void ProcessImage(const char* inputPath, const char* outputPath) {
Mat image = cv::imread(inputPath);
if (image.empty()) return;
Mat gray;
cvtColor(image, gray, cv::COLOR_BGR2GRAY);
imwrite(outputPath, gray);
}
在开始编译之前,我们还需要进行一些操作,打开解决方案资源管理器,右键项目名称 -> 属性 -> C/C++ -> 预编译头,将预编译头更改为不使用预编译头,点击应用 -> 确定。

然后开始生成解决方案:生成-> 生成解决方案。

生成完毕! 找到生成的dll文件,我们之后要用。一般而言,生成好的 DLL 文件会在 项目目录\x64\Debug\ 中。
接下来我们新建 C# 的 Winform 项目

选择语言为 C#,选择Windows 窗体应用(.NET Framework)

随便给项目取个名字,选择保存路径,创建项目。

创建好了以后,打开项目所在文件夹,将之前生成好的 dll 文件复制进 项目目录\bin\Debug\ 中。
接下来,找到自己 OpenCV 的库文件,找到 opencv_world454.dll(我的OpenCV是4.5.4版本的,根据自己动态库使用的版本为准),将其复制进刚刚的文件夹中。
一般opencv_world454.dll 会在 opencv-4.5.4\opencv\build\x64\vc15\bin\ 中。
文件夹内容如下所示。

然后开始设计界面啦,在窗体上添加一个Button控件,我就使用默认控件名称 buttom1 了,双击按钮进入代码界面。
在 C# 中,通过 DllImport 声明 C++ 函数,之后就可以使用在cpp文件中的函数啦。
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace openCVApp
{
public partial class Form1: Form
{
// 引用 DLL 文件
[DllImport("test_dll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void ProcessImage(string inputPath, string outputPath);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 以下路径改为自己的源图路径和保存路径
string inputPath = @"D:\Homework\resources\book_images\baboon.jpg";
string outputPath = @"D:\Homework\save\";
try
{
ProcessImage(inputPath, outputPath);
MessageBox.Show("图像处理完成!");
}
catch (Exception ex)
{
MessageBox.Show($"错误:{ex.Message}");
}
}
}
}
点击运行,点击button1。欸,有问题……

对了,之前的 DLL 文件是 x64 平台生成的,我们需要把 C# 生成平台要保持一致,也改为 x64。
右键项目 -> 属性 -> 生成 -> 目标平台,更改为 x64。

保存,再次运行...
报错显示外部组件发生异常。(思考.jpg)
哦对了,输出路径那里忘记写保存文件名了,改一下
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace openCVApp
{
public partial class Form1: Form
{
// 引用 DLL 文件
[DllImport("test_dll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void ProcessImage(string inputPath, string outputPath);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 以下路径改为自己的源图路径和保存路径
string inputPath = @"D:\Homework\resources\book_images\baboon.jpg";
string outputPath = @"D:\Homework\save\mysave.jpg"; // 加了保存名
try
{
ProcessImage(inputPath, outputPath);
MessageBox.Show("图像处理完成!");
}
catch (Exception ex)
{
MessageBox.Show($"错误:{ex.Message}");
}
}
}
}
运行,显示图像处理完成。

让我们看看有没有保存在指定路径下

保存成功✔
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)