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

5
我有这个方法。
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,但没有任何区别。我收到了带有消息“文件未找到”的消息框。我已经检查了 p 和 StartInfo,一切看起来都正确。StartInfo.UseShellExecute 为 true。调试显示,产生异常的是 p.Start() 这一行。而异常是 System.ComponentModel.Win32Exception,并提示“文件未找到”。文档说,上述代码与 Windows 菜单中的“运行”做的是完全相同的事情,但显然不是这样。如果我在 Windows 菜单的“运行”部分中写入“SDCBackup”,SDCBackup.exe 就会像应该的那样启动。 (而 SDCBackup.exe 是 ClickOnce 安装,除了 Windows 本身之外,没有人真正知道在哪里找到它...)那么我的代码为什么行不通呢?

4
.FileName指的是可执行文件的完整路径或相对路径,请参考这篇帖子(https://dev59.com/vXnZa4cB1Zd3GeqPoEd6)。 - Ryan Wilson
1
你的代码对我起作用了。我将一个exe文件放在我的项目的debug文件夹中,当执行到p.Start()时,程序运行了。SDCBackup必须在bin\debug中,除非你指定一个完整的路径。 - Rich
1
依赖于Environment.CurrentDirectory的值是永远错误的。今天可能不会出错,但在某个雨天就会出错。这是你可以想象到的最糟糕的全局变量。始终使用完整路径名c:\foo\bar\file.ext。在必要时(通常情况下),使用Assembly.GetEntryAssembly().Location来查找程序部署的位置。在Winforms应用程序中,您可以使用Application.StartupPath。 - Hans Passant
Windows菜单中没有“运行”部分。你可能把它和搜索混淆了。 - Panagiotis Kanavos
@rich 如果我输入calc.exe,它可以正常工作。但是显然我的程序不行 - 但是如果我在Windows菜单中搜索SDCBackup,我的程序就会运行。 - Birger Sørensen
@Pangiotis:从learn.microsoft.com/da-dk/dotnet/api/…中得知:“StartInfo成员可用于复制Windows开始菜单的运行对话框的功能。” - Birger Sørensen
2个回答

0

似乎没人知道如何在另一个应用程序中引用 ClickOnce 安装的应用程序。(在 Microsoft 提出了问题,那里也没有得到有用的响应。)

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

C:\Users\[user]\AppData\Local\Apps\2.0 

然后从那里进入三个随机命名的文件夹 - 不同的用户没有相同的文件夹名称; 因此似乎没有办法解决这个问题。

但是我找到了一种方法,可以使用微软提供的Visual Studio C#解决方案创建常规安装程序。

我用它来设置我的应用程序的安装路径,以便它们可以相互找到 - 并且它很好用。

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

我发现,除了说明之外,

  • 您还需要转到安装程序项目的选项
  • 选择**“配置管理器”,
  • 并在构建时将其包含在内
我也发现,版本控制不是自动的。你必须手动设置版本号 - 为了简单起见,这个格式与Visual Studio使用的不同。如果你设置了版本号,它将自动卸载先前版本的同一个应用程序。

你可能需要编辑你的问题,加入提示信息:你要找的应用程序是一个 Click Once 安装程序。我现在在问题中没有看到这一点。你还可以添加 clickonce 标签,以便那些专注于该技术的专家看到这个问题。 - Heretic Monkey

0

使用

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

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

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

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


1
Windows不会做出任何假设。如果可执行文件在本地文件夹中或通过PATH访问,则会运行。否则,它将无法运行。 - Panagiotis Kanavos
1
Windows不会查找已知目录,它会查找在PATH环境变量中指定的目录。.NET也是如此。 - Panagiotis Kanavos
@PanagiotisKanavos 您完全正确。我的修改是否已经解决了这个问题? - Mafii
1
因为这是错误的。添加扩展名是没有帮助的。Windows和.NET使用相同的逻辑,相同的Windows函数来查找可执行文件 - 无论是绝对位置、相对位置还是路径。 - Panagiotis Kanavos
@BirgerSørensen 嗯,RUN字段和您使用的方式之间有所不同。按下 Win+R 键,然后键入 SDCBackup.exe。我想它不会运行。看起来您一直在使用的是开始菜单,而不是 RUN 字段。 - Mafii
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接