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

C# Starting a program from another program

我有这个方法

private void StartSDCBackupSet() {
    using (Process p = new Process()) {
        p.StartInfo.FileName = "SDCBackup";
        try { 
            p.Start(); 
            BackIcon.ShowBalloonTip(5000, "Backup", "Editor for settings startet", ToolTipIcon.Info); 
        } catch (Exception) { 
            MessageBox.Show("Program til settings blev ikke fundet"); 
        }
    }
}

根据我能找到的文档——这里有很多答案——它应该启动另一个程序——SDCBackup.exe。

没有。而且我已经尝试将 .exe 添加到文件名中,但这并没有什么不同。我收到带有消息的消息框... 我检查了 pStartInfo,一切正常。 StartInfo.UseShellExecute 是真的。

调试显示,是 p.Start(); 行产生了异常。异常是 System.ComponentModel.Win32Exception 消息:

File not found

文档说,上面的代码与 Windows 菜单中的 Run 执行相同的操作,但显然不是。

如果我在 Windows 菜单的 运行 部分写入 SDCBackup,SDCBackup.exe 将正常启动。 (而且 SDCBackup.exe 是一个 ClickOnce 安装,没有人真正知道在哪里可以找到 - 除了 Windows 本身......)

那么为什么我的代码不能解决问题?

使用

p.StartInfo.FileName = "SDCBackup.exe";

Windows 测试已知文件类型,如果它是 .exe(或任何其他已知类型,例如 .bat、msc、scr 等),则运行它。据我所知.NET 不会那样做。

您可以尝试使用 Path.GetFullPath (https://msdn.microsoft.com/de-de/library/system.io.path.getfullpath(v=vs.110).aspx),但我认为它也应该适用于相对路径。

还要确保该文件位于您的 debug/release 文件夹中(启动 SDCBackup 的 .exe 所在的任何文件夹),因为 Windows 查找包含在 PATH 变量(例如 C:\windows\System32 等),而 .NET 则没有。如果它不在该文件夹中,请提供一个完全限定的路径,它应该可以工作。

似乎没有人知道如何在另一个应用程序中引用 ClickOnce 安装的应用程序。 (在微软问了这个问题,也没有得到有用的答复。)

ClickOnce 应用程序似乎安装在当前用户区域的某处,例如:

C:\Users\[user]\AppData\Local\Apps.0 

从那里开始有 3 个随机命名的文件夹 - 不同用户的文件夹名称不同;所以似乎没有办法解决这个问题。

但我确实找到了一种方法,可以从 Microsoft 为 Visual Studio C# 解决方案创建常规安装程序。

我用它来设置我的应用程序的安装路径,这样他们就可以找到它 - 而且它起作用了。

它涉及将安装程序项目添加到解决方案。

我发现,除了解释,

  • 您必须转到 Options 安装程序项目,
  • select**"Configuration Manager",
  • 并将其设置为在构建时包含

我还发现,版本控制不是自动的。您必须手动设置版本号 - 为了简单起见,这是一种不同于 Visual Studio 使用的格式。如果您确实设置了版本,它将自动卸载同一应用程序的以前版本。