gpt4 book ai didi

c# - 从另一个 C# 程序启动 C# 程序

转载 作者:行者123 更新时间:2023-11-30 21:29:57 24 4
gpt4 key购买 nike

由于我了解启动应用程序,我知道您可以通过多种方式在 C# .NET 中启动应用程序,但我遇到了在尝试启动 SDL2 应用程序时出现的问题。

我尝试使用 Process 类进行以下操作:

  • 启动构建的 .exe 文件。
  • 使用“cmd.exe/K”或“cmd.exe/c”启动应用程序,然后使用“exec”或“call”或“start”后跟“{path to file}”或“{path to batch file to launch the application }”。通过批处理文件和 CMD 启动应用程序工作正常。但是,每当我尝试启动该应用程序时(即使是在从 cmd.exe/? start 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]}");
}

方法一:

private void BtnLaunchSDLApp_OnClick()
{
pVizualizer = Process.Start(audioSpectrumProgram); //file launched from local path (is correct)
}

方法二:

pVizualizer = Process.Start(audioSpectrumBatchProgram); //file launched from local path (is correct)

方法三:

ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
FileInfo spectrumFileInfo = new FileInfo(audioSpectrumProgram);
if (spectrumFileInfo.Exists)
info.Arguments = $"/c \"{spectrumFileInfo.FullName}\"";
pVizualizer = Process.Start(info);

方法四:基于方法 3 的 senario。您不必使用 ProcessStartInfo 解析参数。

pVizualizer = Process.Start($"cmd.exe /K call \"{spectrumFileInfo.FullName}\"") //to observe what happens to the application

编辑 #2

不受将 UseShellExecute 更改为 truefalse 的影响

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 或其他依赖项
  • 旧 DLL 或从错误位置加载的 DLL(例如已注册的 COM 组件)
  • 错误的工作目录,例如访问不存在的配置文件

关于c# - 从另一个 C# 程序启动 C# 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55021218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com