Подтвердить что ты не робот

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

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

.NET Core 2.0 Process.Start (строка fileName) в документах говорится: "имя файла не обязательно должно представлять исполняемый файл. Это может быть файл любого типа, расширение которого было связано с приложением, установленным в системе".

Однако

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.

Я не могу указать точные пути к исполняемым файлам в качестве параметра метода, так как пользовательские среды являются вариантами (включая версии Windows) и находятся вне моего контроля. По этой же причине мне нужно перенести программу на .Net Core, чтобы она работала как консольное приложение SCD, чтобы не требовалась установка конкретной версии .Net Framework или .NET Core.

Исключение выдается как при запуске отладки Visual Studio, так и при публикации как win-x86 SCD. Мой ПК - Win7 64bit, и я уверен, что .reg и .msi связаны с обычными программами, как и обычный ПК с Windows.

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

4b9b3361

Ответ 1

Вам нужно выполнить cmd.exe

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

не забывайте, что/c

Ответ 2

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

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

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

Ответ 3

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

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