WinForms程序调试及发布后如何打开项目文件夹中的PDF文件?
解决WinForms中用默认程序打开PDF的问题
你的问题核心是在.NET Core/.NET 6+环境下,Process.Start默认不启用Shell执行,而PDF不是可执行文件,必须通过系统Shell调用关联的默认程序打开。另外直接拼接路径容易出错,建议用Path.Combine规范处理。
正确代码实现
using System.Diagnostics; using System.IO; using System.Reflection; private void OpenPdfButton_Click(object sender, EventArgs e) { // 获取程序集所在目录 string assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); // 拼接PDF完整路径(用Path.Combine自动处理路径分隔符) string pdfPath = Path.Combine(assemblyDir, "Resources", "MyPdfDocument.pdf"); // 提前检查文件是否存在 if (!File.Exists(pdfPath)) { MessageBox.Show("目标PDF文件不存在!"); return; } try { ProcessStartInfo startInfo = new ProcessStartInfo { FileName = pdfPath, // 关键设置:启用Shell执行,让系统调用默认关联程序 UseShellExecute = true, WindowStyle = ProcessWindowStyle.Normal }; Process.Start(startInfo); } catch (Exception ex) { MessageBox.Show($"打开PDF失败:{ex.Message}"); } }
关键说明
UseShellExecute = true:这是解决报错的核心。.NET Core及后续版本中,该属性默认值为false,仅允许启动可执行文件;设为true后,系统会通过Shell解析文件关联,自动调用默认PDF阅读器打开文件。Path.Combine:替代直接字符串拼接,自动适配Windows路径分隔符,避免因路径格式错误导致的文件找不到问题。- 文件存在检查:提前验证路径有效性,避免抛出“文件未找到”的异常,提升用户体验。
适配调试/发布场景
你已经将PDF文件的Build Action设为Content、Copy to Output Directory设为Copy Always,这会确保调试(bin/Debug)和发布(bin/Release)时,PDF文件都会被复制到输出目录的Resources子文件夹下,和代码中拼接的路径完全匹配,因此该代码在两种场景下都能正常工作。
之前代码失败的原因
你之前的代码没有设置UseShellExecute = true,系统会尝试把PDF文件当作可执行文件启动,自然会报错“指定的可执行文件不是适用于该OS平台的有效应用程序”。
内容的提问来源于stack exchange,提问作者Jan Badillo
相关产品推荐
相关产品推荐

