【问题标题】:Starting an .exe from the same folder of my C# program从我的 C# 程序的同一文件夹中启动 .exe
【发布时间】:2010-07-10 00:54:43
【问题描述】:

我用 C# 编写了一个小程序,带有一个可以打开另一个 .exe 文件的按钮。

如果我使用它可以正常工作:

private void start_Click(object sender, RoutedEventArgs e)
        {
            System.Diagnostics.Process.Start(@"path to file");
        }

但如果我想让它从同一个文件夹运行 .exe,我基本上想要类似的东西:

private void start_Click(object sender, RoutedEventArgs e)
        {
            System.Diagnostics.Process.Start(@"program.exe");
        }

我错过了什么,我已经尝试了这个网站的解决方案:

var startIngo = new ProcessStartInfo();
startIngo.WorkingDirectory = // working directory
// set additional properties 

Process proc = Process.Start(startIngo);

但 Visual c# 根本无法识别“ProcessStartInfo”...

【问题讨论】:

  • C# 无法识别ProcessStartInfo 是什么意思?当然可以。
  • 顺便说一下,为了让 C# 识别 ProcessStartInfo,你需要导入 System.Diagnostics 命名空间。

标签: c# wpf


【解决方案1】:

你要找的是:

Application.StartupPath

它将返回您的可执行文件的启动路径。

如果您使用的是 WPF,请尝试以下方法:

String appStartPath = System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);

【讨论】:

  • 你能给我一个例子吗?我对此非常陌生,我不太了解微软网站的解释。
  • 他使用的是 WPF,而不是 Windows 窗体 - 不幸的是,这不起作用(这也是我最初的想法)。
  • @Reed:刚刚更新了我的答案以包含 WPF 解决方案。
【解决方案2】:

你可以这样做:

var startupPath = System.IO.Path.GetDirectoryName(
                       System.Reflection.Assembly.GetEntryAssembly().Location);
var programPath = System.IO.Path.Combine(startupPath, "program.exe");

System.Diagnostics.Process.Start(programPath);

【讨论】:

  • 当我将它添加到我的按钮事件时,StartupPath 出现错误。
  • @Joao:我编辑了答案以包含完全限定的名称。这是否正确?
  • 在我的事件中粘贴您的代码后出现错误:名称空间“System.Windows”中不存在类型或名称空间名称“Forms”(您是否缺少程序集引用?)跨度>
  • @Joao:我错过了您正在使用 WPF - 我已将答案更新为与 WPF 兼容的版本。这应该给你你需要的东西;)
【解决方案3】:

ProcessStartInfoSystem.Diagnostics 命名空间中 - 您需要使用 using System.Diagnostics; 语句在 cs 文件顶部导入该命名空间,以便编译器识别 ProcessStartInfo 而无需显式指定使用类。

【讨论】:

  • 好的,我添加了“使用 System.Diagnostics;”到我的页面顶部,我的代码将如何寻找它来工作? startIngo.WorkingDirectory = // 工作目录 我应该只是在 = 之后插入 exe 名称吗?
  • @Joao 这应该可以解决“但是 Visual c# 根本无法识别“ProcessStartInfo”..”。
【解决方案4】:

你也可以试试System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);

获取本地路径。例如

//in your imports/using section
using System.IO
using System.Reflection
using System.Diagnostics;

//in your code to execute
Process.start(Path.GetDirectoryName(Aseembly.GetExecutingAssembly().GetName().CodeBase) + "\\program.exe")

【讨论】:

  • 我将这 3 个放在我的导入中并将其余代码插入到我的事件中,我收到以下错误:错误 1 ​​'System.Diagnostics.Process' 不包含 'start' 错误的定义2 'Path' 是 'System.Windows.Shapes.Path' 和 'System.IO.Path' 之间的模糊引用 错误 3 'System.Windows.Shapes.Path' 不包含 'GetDirectoryName' 的定义 错误 4 名称当前上下文中不存在“Asembly”
【解决方案5】:

有两种情况:

  1. 应用程序直接启动 - 可以从命令行中提取启动路径。

  2. 应用程序是间接启动的 - 例如从单元测试中,无法从命令行提取启动路径,但是您可以在启动期间将其从当前目录读取到静态变量中(在用户有机会更改它之前(例如使用文件打开/保存对话框))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多