我需要使用与用户Windows上关联的这两种文件类型的任何可执行文件自动执行.reg文件和.msi文件。
.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)
使用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一样。
有解决方案吗?任何帮助表示赞赏。
答案 0 :(得分:22)
答案 1 :(得分:10)
您必须执行cmd.exe
var proc = Process.Start(@"cmd.exe ",@"/c C:\Users\user2\Desktop\XXXX.reg")
不要忘记/ c
答案 2 :(得分:3)
如果这也会打扰您,
对于我们中那些习惯于简单地调用Process.Start(fileName);
的人来说,以上语法可能会使我们感到焦虑……那么我可以补充一点,您可以用一行代码来编写它?
new Process { StartInfo = new ProcessStartInfo(fileName) { UseShellExecute = true } }.Start();
答案 3 :(得分:0)
使用此文件打开文件
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);
}
}
答案 4 :(得分:-1)
您可以将UseShellExecute设置为true并将其和您的路径包括在ProcessStartInfo对象中
Process.Start(new ProcessStartInfo((@"C:\Users\user2\Desktop\XXXX.reg") { UseShellExecute = true });