2017-10-18 1403 views
2

我需要让一个.reg文件和一个.msi文件自动使用与这两种文件类型关联的任何可执行文件执行用户的Windows。.Net Core 2.0 Process.Start抛出“指定的可执行文件不是此OS平台的有效应用程序”

.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) 

与错误码和的HResult -2147467259,和NativeErrorCode 193

相同的代码在.Net框架没有工作3.5或4控制台应用程序。

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

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

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

回答

1

,你必须执行CMD.EXE

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

不要忘记/ C

1

您还可以将ProcessStartInfoUseShellExecute属性设置为true

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

似乎在.net Core中进行更改,如文档here所述。

相关问题