如何通过WinForm调用.NET MAUI程序自定义QRCode生成文件名?
WinForm调用.NET MAUI生成自定义文件名二维码的实现方案
完全可行,但需要改造.NET MAUI程序,让它支持命令行参数触发二维码生成,而不是仅依赖UI按钮点击。以下是具体步骤:
1. 改造.NET MAUI程序,支持命令行调用
封装二维码生成逻辑
把二维码生成和保存的代码封装成独立的静态方法,脱离UI按钮的依赖:
using System.IO; using SkiaSharp; using ZXing.Net.Maui; using ZXing.Common; public static class QRCodeHelper { // 传入二维码内容和完整保存路径,直接生成并保存 public static void GenerateQRCode(string content, string fullSavePath) { #if WINDOWS // 生成二维码像素数据 var writer = new BarcodeWriterPixelData { Format = BarcodeFormat.QR_CODE, Options = new EncodingOptions { Width = 300, Height = 300, Margin = 1 } }; var pixelData = writer.Write(content); // 转换为PNG字节并保存 using var stream = new MemoryStream(); using var bitmap = new SKBitmap(pixelData.Width, pixelData.Height); bitmap.Pixels = pixelData.Pixels; using var image = SKImage.FromBitmap(bitmap); using var data = image.Encode(SKEncodedImageFormat.Png, 100); data.SaveTo(stream); File.WriteAllBytes(fullSavePath, stream.ToArray()); #endif } }
修改MAUI入口,处理命令行参数
修改Program.cs,让程序启动时先检查命令行参数,如果有参数则直接生成二维码并退出,不启动UI:
namespace YourMauiAppName; public static class MauiProgram { public static MauiApp CreateMauiApp(string[] args) { // 优先处理命令行参数:第一个参数是二维码内容,第二个是保存路径 if (args.Length >= 2) { string qrContent = args[0]; string savePath = args[1]; QRCodeHelper.GenerateQRCode(qrContent, savePath); Environment.Exit(0); // 生成完成直接退出 } // 原MAUI初始化逻辑(保留UI模式) var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }); return builder.Build(); } [STAThread] public static void Main(string[] args) { var app = CreateMauiApp(args); app.Run(); } }
2. 打包MAUI程序为可执行文件
右键MAUI项目 → 选择发布 → 目标平台选Windows,打包生成独立的exe文件(建议选择"单文件"模式,方便调用)。
3. WinForm端调用MAUI程序
在WinForm的按钮点击事件中,获取文本框的文件名,拼接完整保存路径,通过Process启动MAUI的exe并传递参数:
using System.Diagnostics; using System.IO; private void btnGenerateQR_Click(object sender, EventArgs e) { string mauiExePath = @"C:\发布路径\YourMauiApp.exe"; // MAUI exe的实际路径 string qrContent = "需要生成二维码的内容"; // 可改为从WinForm的文本框获取 string fileName = txtFileName.Text.Trim(); // 校验文件名 if (string.IsNullOrEmpty(fileName)) { MessageBox.Show("请输入文件名"); return; } if (!fileName.EndsWith(".png", StringComparison.OrdinalIgnoreCase)) { fileName += ".png"; } // 拼接完整保存路径 string savePath = Path.Combine(@"C:\my\file\path", fileName); // 启动MAUI程序 var startInfo = new ProcessStartInfo { FileName = mauiExePath, Arguments = $"\"{qrContent}\" \"{savePath}\"", // 传递参数(带引号避免路径有空格) UseShellExecute = false, CreateNoWindow = true // 不显示MAUI的UI窗口 }; try { using var process = Process.Start(startInfo); process.WaitForExit(); MessageBox.Show(process.ExitCode == 0 ? "二维码生成成功" : "二维码生成失败"); } catch (Exception ex) { MessageBox.Show($"调用失败:{ex.Message}"); } }
为什么之前尝试失败?
你之前的MAUI程序仅在UI按钮点击时触发生成逻辑,没有提供外部调用的入口。改造后通过命令行参数直接触发生成逻辑,无需依赖UI交互,就能被WinForm正常调用。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

