无法 运行 来自 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.exe
或 Explorer.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();
}
我构建了一个简单的 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.exe
或 Explorer.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 whenUseShellExecute is true
than whenUseShellExecute is false
.
- When
UseShellExecute
is true, theWorkingDirectory
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
, theWorkingDirectory
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();
}