由于我了解启动应用程序的知识,我知道您有多种方法在C#.NET中启动应用程序,但我遇到了尝试启动SDL2应用程序时出现的问题。
我使用Process类尝试以下方法:
cmd.exe /K
”或“cmd.exe /c
”开始应用程序,然后使用“exec
”或“call
”或“start
”,接着是“{path to file}
”或“{path to batch file to launch the application}
”。通过批处理文件和CMD启动应用程序工作正常。但是,每当我尝试启动应用程序时(即使在从cmd.exe /?启动cmd.exe?params启动的命令提示符的新实例中),它也不会产生任何结果。我可以观察到应用程序试图打开。启动到窗口模式(启动3D环境)需要永远。超时后,它将在关闭前呈现空白窗口的几帧,或在打开窗口后立即关闭。
所以我的问题是,是否有人成功地为使用C#.NET编写的SDL应用程序创建了一个启动器应用程序?或者知道调试此行为的方法?因为不幸的是,应用程序没有发出错误消息,并且由于SDL安全地关闭应用程序,我也无法观察到崩溃。
编辑#1
我没有做任何花哨的参数,因为不应该有任何参数。我已经有另一个功能启动正常的C#应用程序,因为我的启动器需要打开2个程序。 1个SLD应用程序,1个COM:VBA控制应用程序。鉴于:
string audioSpectrumProgram = "AudioSpectrum.exe";
string audioSpectrumBatchProgram = "AudioSpectrum.bat";
private void BtnLaunchPPTApp_OnClick()
{
//Powerpoint controlling application
pVBAApp = Process.Start(presenterProgram, $"\"{this.path}\" {this.audioFormatParams[0]} {((this.ckboxGenerate.Checked) ? "--create" : "")} lang={this.languageCodesParams[this.cboxLanguage.SelectedIndex]}");
}
方法1:
private void BtnLaunchSDLApp_OnClick()
{
pVizualizer = Process.Start(audioSpectrumProgram); //file launched from local path (is correct)
}
方法2:
pVizualizer = Process.Start(audioSpectrumBatchProgram); //file launched from local path (is correct)
方法3:
ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
FileInfo spectrumFileInfo = new FileInfo(audioSpectrumProgram);
if (spectrumFileInfo.Exists)
info.Arguments = $"/c \"{spectrumFileInfo.FullName}\"";
pVizualizer = Process.Start(info);
方法4:基于方法3的场景。您不必使用ProcessStartInfo解析参数。
pVizualizer = Process.Start($"cmd.exe /K call \"{spectrumFileInfo.FullName}\"") //to observe what happens to the application
编辑#2
不会将UseShellExecute更改为true
或false
private void btnOpenVisualizer_Click(object sender, EventArgs e)
{
FileInfo spectrumFileInfo = new FileInfo(audioSpectrumProgram);
ProcessStartInfo info = new ProcessStartInfo(spectrumFileInfo.FullName);
info.UseShellExecute = true;
pVizualizer = new Process();
pVizualizer.StartInfo = info;
pVizualizer.EnableRaisingEvents = true;
pVizualizer.Exited += new EventHandler(myProcess_Exited);
pVizualizer.Start();
}
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
$"Exit time : {pVizualizer.ExitTime}\n" +
$"Exit code : {pVizualizer.ExitCode}\n"
);
}
分析启动问题的一般方法是使用SysInternals Process Monitor。
记录未正常启动的应用程序。为您的应用程序使用过滤器。然后浏览结果列中没有SUCCESS
的所有项目。通常,您希望自下而上执行该操作,因为上一个错误是阻止您的应用程序加载的错误。
像这样你会发现常见的启动问题,如:
确定以供将来参考:文件的路径可能是正确的,一切都可能正常,但如果您使用DLL进行导入。更改进程的工作目录。
该项目将运行,libs可以“有时”找到,但可能导致像这样的奇怪的未知错误。因此,使用SDL或任何其他类型的库运行另一个C#实例的最佳方式是:
private void RunSDLProgram()
{
FileInfo spectrumFileInfo = new FileInfo("pathToFile.exe");
ProcessStartInfo info = new ProcessStartInfo(spectrumFileInfo.FullName);
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
info.WorkingDirectory = spectrumFileInfo.DirectoryName;
pVizualizer = new Process();
pVizualizer.StartInfo = info;
pVizualizer.EnableRaisingEvents = true;
pVizualizer.Exited += new EventHandler(myProcess_Exited);
pVizualizer.Start();
}
private void myProcess_Exited(object sender, System.EventArgs e)
{
Console.WriteLine(
$"Exit time : {pVizualizer.ExitTime}\n" +
$"Exit code : {pVizualizer.ExitCode}\n" +
$"output : {pVizualizer.StandardOutput}\n" +
$"err : {pVizualizer.StandardError}\n"
);
}
运行批处理文件将查看它自己的目录并使所有引用都是本地的,但它不会改变工作目录。 (我已经怀疑有关更改工作目录但我没有看到在process.start("cmd.exe");
中调用2个操作的方法)