75

我需要让 .reg 文件和 .msi 文件使用与用户 Windows 上相关联的这两种文件类型的任何可执行文件自动执行。

.NET Core 2.0 Process.Start(string fileName) docs说:“文件名不需要代表可执行文件。它可以是扩展名与系统上安装的应用程序相关联的任何文件类型。”

然而

using(var proc = Process.Start(@"C:\Users\user2\Desktop\XXXX.reg")) { } //.msi also

给我

System.ComponentModel.Win32Exception (0x80004005): The specified executable is not a valid application for this OS platform.
   at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start(String fileName)

带有 ErrorCode 和 HResult -2147467259,以及 NativeErrorCode 193。

相同的代码在 .Net Framework 3.5 或 4 控制台应用程序中确实有效。

我无法指定确切的 exe 文件路径作为方法的参数,因为用户的环境是变体(包括 Windows 版本)并且不受我的控制。这也是我需要将程序移植到 .Net Core 的原因,试图让它作为SCD控制台应用程序运行,这样就不需要安装特定的 .Net Framework 或 .NET Core 版本。

在 Visual Studio 调试运行和发布为 win-x86 SCD 时都会引发异常。我的 PC 是 Win7 64 位,我确信 .reg 和 .msi 与通常的 Windows PC 一样与常规程序相关联。

有解决方案吗?任何帮助表示赞赏。

4

5 回答 5

127

也可以将 of 的UseShellExecute属性设置ProcessStartInfo为 true

var p = new Process();
p.StartInfo = new ProcessStartInfo(@"C:\Users\user2\Desktop\XXXX.reg")
{ 
    UseShellExecute = true 
};
p.Start();

似乎是 .net Core 的变化,如此所述。

于 2017-11-02T01:32:20.540 回答
42

您可以将 UseShellExecute 设置为 true 并将此路径和您的路径包含在 ProcessStartInfo 对象中:

Process.Start(new ProcessStartInfo(@"C:\Users\user2\Desktop\XXXX.reg") { UseShellExecute = true });
于 2019-07-22T13:18:21.147 回答
19

你必须执行 cmd.exe

var proc = Process.Start(@"cmd.exe ",@"/c C:\Users\user2\Desktop\XXXX.reg")

不要忘记 /c

于 2017-10-18T10:52:48.417 回答
17

如果这也困扰您:

对于我们这些习惯于简单调用Process.Start(fileName);上述语法的人来说可能会让我们感到焦虑......所以我可以补充一下,你可以用一行代码编写它吗?

new Process { StartInfo = new ProcessStartInfo(fileName) { UseShellExecute = true } }.Start();
于 2020-07-15T16:14:01.997 回答
-2

用它来打开一个文件

new ProcessStartInfo(@"C:\Temp\1.txt").StartProcess();

需要这个扩展方法

public static class UT
{
    public static Process StartProcess(this ProcessStartInfo psi, bool useShellExecute = true)
    {
        psi.UseShellExecute = useShellExecute;
        return Process.Start(psi);
    }
}
于 2019-12-06T22:42:58.383 回答