.Net Core 2.0 Process.Start throws "The specified executable is not a valid application for this OS platform"

59

I need to let a .reg file and a .msi file execute automatically using whatever executables these two file types associated with on user's Windows.

.NET Core 2.0 Process.Start(string fileName) docs says: "the file name does not need to represent an executable file. It can be of any file type for which the extension has been associated with an application installed on the system."

However

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

gives me

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)

with ErrorCode and HResult -2147467259, and NativeErrorCode 193.

The same code did work in .Net Framework 3.5 or 4 console app.

I can't specify exact exe file paths as the method's parameter since users' environments are variant (including Windows versions) and out of my control. That's also why I need to port the program to .Net Core, trying to make it work as SCD console app so that installation of specific .Net Framework or .NET Core version is not required.

The exception is thrown both in Visual Studio debugging run and when published as win-x86 SCD. My PC is Win7 64bit and I'm sure .reg and .msi are associated with regular programs as usual Windows PC does.

Is there solution for this? Any help is appreciated.

c#
.net-core
win32exception
asked on Stack Overflow Oct 18, 2017 by user3187356

5 Answers

100

You can also set the UseShellExecute property of ProcessStartInfo to true

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

Seems to be a change in .net Core, as documented here.

answered on Stack Overflow Nov 2, 2017 by Mathew
35

You can set UseShellExecute to true and include this and your path in a ProcessStartInfo object:

Process.Start(new ProcessStartInfo(@"C:\Users\user2\Desktop\XXXX.reg") { UseShellExecute = true });
answered on Stack Overflow Jul 22, 2019 by Liam • edited Oct 15, 2019 by NetMage
18

You have to execute cmd.exe

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

don't forget the /c

answered on Stack Overflow Oct 18, 2017 by owairc
10

In case this bothers you as well:

For those of us that are used to simply calling Process.Start(fileName); the above syntax may give us anxiety... So may I add that you can write it in a single line of code?

new Process { StartInfo = new ProcessStartInfo(fileName) { UseShellExecute = true } }.Start();
answered on Stack Overflow Jul 15, 2020 by Yosef Bernal • edited Mar 19, 2021 by Yosef Bernal
-1

use this to open a file

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

need this extension method

public static class UT
{
    public static Process StartProcess(this ProcessStartInfo psi, bool useShellExecute = true)
    {
        psi.UseShellExecute = useShellExecute;
        return Process.Start(psi);
    }
}
answered on Stack Overflow Dec 6, 2019 by Rm558

User contributions licensed under CC BY-SA 3.0