如果可能,即使扩展名不是,您将如何强制 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 启动时出现错误(无论随机文件扩展名是什么)。
只需设置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()函数。无论文件名如何,该函数在启动任何有效的可执行文件时都没有任何问题。