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

C# 从另一个程序启动一个程序,c#,.net,clickonce,C#,.net,Clickonce,我有这个方法 private void StartSDCBackupSet() { using (Process p = new Process()) { p.StartInfo.FileName = "SDCBackup"; try { p.Start(); BackIcon.ShowBalloonTip(5000, "Backup", "Editor for settings startet", To

我有这个方法

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菜单中的
Run
功能相同,但显然不是

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

那么为什么我的代码不起作用呢?使用

p.StartInfo.FileName = "SDCBackup.exe";
Windows测试已知的文件类型,如果是.exe(或任何其他已知类型,如.bat、msc、scr等),则运行它。据我所知.NET并没有做到这一点

您可以尝试使用
Path.GetFullPath
(),但我认为它也应该适用于相对路径


还要确保该文件位于调试/发布文件夹(启动SDCBackup的.exe所在的任何文件夹)内,因为Windows会查找
路径
变量中包含的已知目录(例如
C:\Windows\System32
等),而.NET则不会。如果它不在该文件夹中,请提供一个完全限定的路径,它应该可以工作。

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

ClickOnce应用似乎安装在当前用户区域的某个位置,例如:

C:\Users\[user]\AppData\Local\Apps\2.0 
并从那里3个随机命名的文件夹下来-和不相同的文件夹名称为不同的用户;所以似乎没有办法解决这个问题

但我确实从微软获得了一种方法,为Visual Studio C#solutions创建了一个常规安装程序

我用它来设置我的应用程序的安装路径,这样它们就可以相互找到它——并且它可以正常工作

  • 安装
  • 并遵循
它涉及将安装程序项目添加到解决方案中

我发现除了解释之外,

  • 对于安装程序项目,您必须转到选项
  • 选择**“配置管理器”
  • 并将其设置为在构建时包含

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

。文件名
指的是可执行文件的完整路径或相对路径,请参阅本文()您的代码为我工作。我将一个exe文件放在项目的调试文件夹中,当执行点击p.Start()时,程序运行。除非指定完整路径,否则SDCBackup必须位于bin\debug中。依赖Environment.CurrentDirectory的值永远是错误的。今天可能不会错,雨天也会错。这是你能想象到的最糟糕的全局变量。始终使用完整路径名c:\foo\bar\file.ext。必要时(通常),使用Assembly.GetEntryAssembly().Location查找程序最终部署的位置。在Winforms应用程序中,您可以使用Application.StartupPath。Windows菜单中没有运行部分。你可能把它和搜索混淆了。@rich如果我输入calc.exe f.ex,它就可以正常工作了。但显然不是用我自己的程序,但如果我在Windows菜单的搜索中键入SDCBackup,我的程序就运行了。如果可执行文件位于本地文件夹中或可通过
路径访问,它将运行。如果不是,则不会。Windows也不会查找已知目录,而是查找路径环境vairalbe中指定的目录。NET做的same@PanagiotisKanavos你完全正确。这是我编辑的地址吗?因为它错了。添加扩展名没有帮助。Windows和.NET使用相同的逻辑、相同的Windows函数来查找可执行文件—绝对位置、相对位置或路径—为什么它在Windows中运行,而不是在我的代码中运行,那么,如果它们执行相同的操作?赢7,开始-底部有一条线。我输入我的程序名,它就运行了。随便你怎么说。Windows找到该程序,.NET找不到。Qestion是为什么?您可能希望编辑您的问题,以包含提示您正在寻找的应用程序是一次点击安装。我现在在问题中看不到这一点。您可能还想添加
clickonce
标记,以便该技术的专家能够看到问题。