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

问题描述 投票:2回答:2

由于我了解启动应用程序的知识,我知道您有多种方法在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 /?启动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更改为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"
            );
    }
c# .net sdl sdl-2
2个回答
2
投票

分析启动问题的一般方法是使用SysInternals Process Monitor

记录未正常启动的应用程序。为您的应用程序使用过滤器。然后浏览结果列中没有SUCCESS的所有项目。通常,您希望自下而上执行该操作,因为上一个错误是阻止您的应用程序加载的错误。

像这样你会发现常见的启动问题,如:

  • 缺少DLL或其他依赖项
  • 从错误位置加载的旧DLL或DLL(例如已注册的COM组件)
  • 错误的工作目录,例如访问不存在的配置文件

1
投票

确定以供将来参考:文件的路径可能是正确的,一切都可能正常,但如果您使用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个操作的方法)

© www.soinside.com 2019 - 2024. All rights reserved.