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

标签 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", 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 ),但我认为它也应该适用于相对路径。

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

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

相关文章:

visual-studio-2010 - 通过 Visual Studio 2010 作为 ClickOnce 应用程序部署的一部分安装 .NET Framework 时出现错误代码 5100

c# - 如何避免或检测 C# 中的隐式委托(delegate)推断?

c# - 如何使用绑定(bind)源更新数据 GridView

.net - 获取基本登录提示而不是重定向

c# - ODBC 连接到 Excel 错误

c# - 使用 ClickOnce 安装我的应用程序 - 缺少 dll 消息(尽管未请求)

c# - 计算屏幕空间误差

c# - 对报告中的 CSV 数据进行排序

c# - 需要viber webservice或api地址

c# - 修改注册表中的环境变量