.Net Core 2.0 Process.Start抛出"指定的可执行文件不是此OS平台的有效应用程序"

use*_*356 22 c# win32exception .net-core

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

.NET核2.0的Process.Start(字符串文件名)文档说:"文件名并不需要代表一个可执行文件它可以是任何一种扩展已经安装在系统上的应用程序相关的任何类型的文件."

然而

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

给我

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)
Run Code Online (Sandbox Code Playgroud)

使用ErrorCode和HResult -2147467259,以及NativeErrorCode 193.

相同的代码在.Net Framework 3.5或4控制台应用程序中工作.

我不能指定精确的exe文件路径作为方法的参数,因为用户的环境是变体(包括Windows版本)并且不受我的控制.这也是为什么我需要将程序移植到.Net Core,尝试使其作为SCD控制台应用程序工作,以便不需要安装特定的.Net Framework或.NET Core版本.

Visual Studio调试运行和发布为win-x86 SCD时都会抛出异常.我的电脑是Win7 64bit,我确信.reg和.msi与常规程序一样,与Windows PC一样.

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

Lia*_*iam 39

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

Process.Start(new ProcessStartInfo(@"C:\Users\user2\Desktop\XXXX.reg") { UseShellExecute = true });
Run Code Online (Sandbox Code Playgroud)


Mat*_*hew 34

您还可以将UseShellExecute属性设置ProcessStartInfo为true

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

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

  • 将 `UseShellExecute` 从 `false` 更改为 `true` 对我有用:-) (2认同)
  • 请参阅 Microsoft [此处的重大更改文档](https://learn.microsoft.com/en-us/dotnet/core/compatibility/fx-core) (2认同)

Yos*_*nal 14

如果这也困扰您:

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

new Process { StartInfo = new ProcessStartInfo(fileName) { UseShellExecute = true } }.Start();
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,效果很好 (3认同)

小智 11

您必须执行cmd.exe

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

别忘了/ c

  • 这是可行的,但会保持打开的命令窗口,直到打开的应用程序关闭。例如,如果我想打开一个doc文件,cmd窗口将保持打开状态,直到我关闭Word。如果使用 UseShellExecute 的其他解决方案会更好。 (4认同)
  • 这不应该是公认的答案。使用 ProcessStartInfo 和 UseShellExecute = true 效果更好。 (3认同)