如何强制 Windows 作为 EXE 启动进程

1 .net c# process

如果可能,即使扩展名不是,您将如何强制 C# 代码将任何给定文件作为 exe 运行.exe?

比如我的代码从程序资源中提取一个exe到用户的漫游文件夹中并启动;GetRandomFileName()返回 XXXXXX.XXX Xs 是随机字符,但如果我尝试这样做:

string exePath = @"C:\Users\" + Environment.UserName + @"\AppData\Roaming\" + Path.GetRandomFileName();

using (FileStream exeFile = new FileStream(exePath, FileMode.CreateNew))
                            exeFile.Write(exeBytes, 0, exeBytes.Length);

process.StartInfo = processStartInfo;
processStartInfo.FileName = exePath;
Process.Start();
Run Code Online (Sandbox Code Playgroud)

当 Windows 尝试将程序作为 .XXX 启动时出现错误(无论随机文件扩展名是什么)。

给出的错误图像:
在此处输入图片说明

Pet*_*iho 6

只需设置UseShellExecute为false:

process.StartInfo = processStartInfo;
processStartInfo.FileName = exePath;
processStartInfo.UseShellExecute = false;
Process.Start();
Run Code Online (Sandbox Code Playgroud)

默认情况下,Process将使用 Windows Shell 来尝试启动您的文件。Shell 会查看扩展名,以确定应该实际运行哪个程序。已知可执行文件直接运行,但检查任何其他文件的文件扩展名关联。如果不存在,您会收到提示以找到一个程序来运行它。

您可以通过设置UseShellExecute为来绕过所有这些false。这迫使Process类直接使用本机CreateProcess()函数。无论文件名如何,该函数在启动任何有效的可执行文件时都没有任何问题。