.net 使用系统.诊断.进程.启动打开EML文件时出现异常

s4n0splo  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(130)

如果您将电子邮件保存到扩展名为EML的磁盘上的文件,您可以通过双击该文件在Windows上的Outlook中打开它。我希望做一些类似的事情,因为我的应用程序可以遇到它需要打开的EML文件。
我有一些粗糙的测试代码,具有:

using System;
using System.Diagnostics;
using System.IO;

然后:

System.Diagnostics.Process.Start(@"C:\temp\test.eml");

当我运行代码时,我得到了以下异常:
System.ComponentModel.Win32Exception:尝试启动工作目录为“C:\Users\me\source\repos\TestProj\TestProj\bin\Release\net6.0-windows”的进程“C:\temp\test.eml”时出错。指定的可执行文件不是此操作系统平台的有效应用程序。
我曾尝试在同一文件夹中放置一个简单的文本文件,并将其命名为“test.txt”,然后检查双击它时它是否会在记事本中打开,但如果我尝试使用以下命令打开它:

System.Diagnostics.Process.Start(@"C:\temp\test.txt");

我得到了同样的错误。我哪里错了?

rseugnpd

rseugnpd1#

与.NET Framework相比,.NET Core有一个突破性的变化:

更改UseShellExecute的默认值

ProcessStartInfo.UseShellExecute在.NET核心上的默认值为false。在.NET Framework上,其默认值为true。

更改说明

Process.Start允许您直接启动应用程序,例如,使用Process.Start("mspaint.exe")等启动Paint的代码。如果ProcessStartInfo.UseShellExecute设置为true,则还允许您间接启动关联的应用程序。在.NET Framework上,ProcessStartInfo.UseShellExecute的默认值为true,这意味着Process.Start("mytextfile.txt")等代码将启动记事本。如果您已将.txt文件与该编辑器关联。若要防止在.NET Framework上间接启动应用,必须将ProcessStartInfo.UseShellExecute显式设置为false。在.NET核心上,ProcessStartInfo.UseShellExecute的默认值为false。这意味着,默认情况下,当你调用Process.Start时,相关的应用程序不会启动。
使用接受ProcessStartInfoProcess.Start过载,并将UseShellExecute设置为true

var processStartInfo = new ProcessStartInfo
{
    FileName = @"C:\temp\test.eml",
    UseShellExecute = true
};
Process.Start(processStartInfo);

否则,请提供可执行文件的路径并将文件的路径作为参数传递:

var pathToOutlook = @"C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE";
Process.Start(pathToOutlook,  @"D:\Downloads\sample.eml");

相关问题