无法 运行 来自 windows 表单的 .exe 文件 - Visual Studio

Cannot run a .exe file from windows form - Visual Studio

我构建了一个简单的 windows 表单,当我按下一个按钮时 运行 一个在 TextBox

中指示的过程

我试过这个代码

Try
    System.Diagnostics.Process.Start(TextBox1.Text)
Catch ex As Exception
    MsgBox("Error")
End Try

代码有效,但我不明白为什么我不能 运行 使用 gcc 从编译的 c 项目生成 .exe(这是我的目标)。

我也试过以管理员身份执行。

有人可以解释一下吗?

我post这里是我在按钮点击事件中写的代码。也许对某人有用

Try
    Dim startInfo As New ProcessStartInfo
    startInfo.UseShellExecute = True
    startInfo.WorkingDirectory = "C:\workDirectory"
    startInfo.FileName = TextBox1.Text
    System.Diagnostics.Process.Start(startInfo)
Catch ex As Exception
    MsgBox("Error")
End Try

感谢@Dai 的帮助

(将我的评论转换为答案)

Code works, but I don't understand why I canno't run a .exe genereted from a compiled c project using gcc (which is my goal).

我怀疑问题是您的 gcc-编译的可执行文件对与您的 gcc-编译的可执行文件位于同一文件系统目录中的文件具有运行时依赖性,并且它仅通过它们的 short-names(例如“someFile.txt”)而不是通过它们的 absolute-path 文件名(例如 "C:\my-gcc-program\bin\someFile.txt"),然后 OS 在该进程的工作目录中查找(aka Current Directory).

请注意,当您的程序使用 Process.Start(String fileName) 时,新创建的(子)OS 进程将继承您进程的工作目录,而不是将其重置为新进程的可执行文件名的父目录!

因此,如果您的子进程期望“someFile.txt”在其 working-directory 中,那么您需要使用正确的 working-directory 启动 child-process 而不是继承它来自您的流程。

您可以通过两种不同的方式执行此操作,这两种方式都需要您使用 ProcessStartInfo 而不是任何接受 String fileName.

Process.Start 重载

选项 1:直接设置 ProcessStartInfo.WorkingDirectory

ProcessStartInfo psi = new ProcessStartInfo()
{
    FileName = @"C:\my-gcc-program\bin\program.exe",
    WorkingDirectory = @"C:\my-gcc-program\bin",
}

using( Process p = Process.Start( psi ) )
{
    p.WaitForExit();
}

选项 2:使用 ProcessStartInfo.UseShellExecute

UseShellExecute 选项创建新进程,就像用户通过他们的 OS shell 启动它一样,例如 cmd.exeExplorer.exe 而不是作为您的流程的子流程。此选项的(众多)效果之一是 OS 会自动为您处理设置此新进程的 Working-directory。

请注意,在 .NET Framework 中,默认情况下为 true - 但在 .NET Core 中为 false(如果在 UWP 中使用会导致错误)。因为在 .NET Core 中默认情况下它不是 true 如果您依赖它在除 UWP 之外的所有平台上工作,您应该明确设置它。

请注意,使用UseShellExecute == true时,您仍然必须提供有效的WorkingDirectory路径,however its purposes changes:

  • The WorkingDirectory property behaves differently when UseShellExecute is true than when UseShellExecute is false.
    • When UseShellExecute is true, the WorkingDirectory property specifies the location of the executable.
      • If WorkingDirectory is an empty string, the current directory is understood to contain the executable.
      • When UseShellExecute is true, the working directory of the application that starts the executable is also the working directory of the executable.
    • When UseShellExecute is false, the WorkingDirectory property is not used to find the executable. Instead, its value applies to the process that is started and only has meaning within the context of the new process.
ProcessStartInfo psi = new ProcessStartInfo()
{
    FileName = @"program.exe",
    WorkingDirectory = @"C:\my-gcc-program\bin",
    UseShellExecute = true
}

using( Process p = Process.Start( psi ) )
{
    p.WaitForExit();
}