.Net Core 2.0 Выбрасывает Process.Start Указанный исполняемый файл не является допустимым приложением для этой платформы ОС

Мне нужно, чтобы файл .reg и файл .msi выполнялись автоматически с использованием любых исполняемых файлов, с которыми эти два типа файлов связаны в Windows пользователя.

Процесс .NET Core 2.0 .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. Мой компьютер - Win7 64bit, и я уверен, что .reg и .msi связаны с обычными программами, как и обычный ПК с Windows.

Есть ли решение для этого? Любая помощь приветствуется.


person user3187356    schedule 18.10.2017    source источник


Ответы (5)


Вам нужно запустить cmd.exe

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

не забывайте / c

person owairc    schedule 18.10.2017
comment
Это работает, но окно cmd остается открытым, пока открытое приложение не будет закрыто. Например, если я хочу открыть файл документа, окно cmd остается открытым, пока я не закрою Word. Лучше, если использовать другое решение с UseShellExecute. - person Álvaro García; 11.10.2019
comment
Это не должен быть принятым ответом. Лучше использовать ProcessStartInfo с UseShellExecute = true. - person Paul Williams; 21.05.2021

Вы также можете установить для свойства UseShellExecute ProcessStartInfo значение true

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

Похоже, это изменение в .net Core, как описано здесь.

person Mathew    schedule 02.11.2017
comment
Изменение UseShellExecute с false на true у меня работает :-) - person Greg Trevellick; 31.12.2018
comment

Вы можете установить для UseShellExecute значение true и включить это и свой путь в объект ProcessStartInfo:

Process.Start(new ProcessStartInfo(@"C:\Users\user2\Desktop\XXXX.reg") { UseShellExecute = true });
person Liam    schedule 22.07.2019
comment
преобразовал приложение из net48 в netcoreapp3.1, UseShellExecute = true было необходимо на dotnetcore (работающем в Windows) - person huzle; 14.03.2020
comment
Я использовал .msg файл не открывался. Я получаю эту ошибку System.ComponentModel.Win32Exception: «Система не может найти указанный файл». . - person Kumar Shanmugam; 08.06.2021

Если вас это тоже беспокоит:

Для тех из нас, кто привык просто вызывать Process.Start(fileName);, приведенный выше синтаксис может вызывать у нас беспокойство ... Могу я добавить, что вы можете написать его в одной строчке кода?

new Process { StartInfo = new ProcessStartInfo(fileName) { UseShellExecute = true } }.Start();
person Yosef Bernal    schedule 15.07.2020
comment
Это должен быть принятый ответ, отлично работает - person dgxhubbard; 12.03.2021
comment
Я согласен с @dgxhubbard, что это должен быть принятый ответ, потому что этот ответ подавляет командное окно, а принятый ответ - нет (и командное окно отображается, пока приложение открыто). - person J Weezy; 18.03.2021

используйте это, чтобы открыть файл

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);
    }
}
person Rm558    schedule 06.12.2019