【问题标题】:Start an external process on mac with c#使用 c# 在 mac 上启动外部进程
【发布时间】:2013-03-05 08:42:08
【问题描述】:

我已成功使用 System.Diagnostics.Process.Start() 在 Windows 上启动我的外部单声道可执行文件。但是它在mac上失败了。我没有收到任何错误,根本没有发生任何事情。

我尝试了以下方式:

System.Diagnostics.Process.Start("mono", "/path/program.exe");

我也试过像下面这样打开终端(也失败了):

System.Diagnostics.Process.Start("Terminal");

我唯一能做的就是通过以下方式启动终端:

System.Diagnostics.Process.Start("open", "-a Terminal");

有什么想法吗?非常感谢任何帮助。

谢谢!

【问题讨论】:

  • @konrad.kruczynski 这对我不起作用。实际上,我什至尝试在“/Libraries/Frameworks/Mono.framework/Versions/2.*/bin/mono”启动实际的单声道可执行文件。该文件在那里,但是在它上面调用 System.Diagnostics.Process.Start 什么都不做。我唯一能够使用 Process.Start 启动的是“open -a Terminal”。
  • 它对我来说很好,猜猜这是一个错误(或旧的 Mono 版本或类似的东西)。不要犹豫,在这里创建错误报告:bit.ly/qFa0pT

标签: c# macos mono process.start


【解决方案1】:

您需要做的是使用实际可执行文件的完整路径。在 OSX 上,“应用程序”实际上是带有 .app 扩展名的特殊结构化文件夹,可执行文件(通常)位于 Content/MacOS/[name] 下。

例如,打开终端:

System.Diagnostics.Process.Start("/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal");

或者对于文本编辑:

System.Diagnostics.Process.Start("/Applications/TextEdit.app/Contents/MacOS/TextEdit");

要找到可执行文件,您可以右键单击(或按住 Control 单击)应用程序,然后选择 显示包内容,这将在 Finder 中打开实际文件夹。然后,您可以导航到 Contents/MacOS 文件夹以找到实际的可执行文件。

要运行您的 Mono 可执行文件,您必须使用 mono 可执行文件的完整路径并将您的程序作为参数传递。通常是/usr/local/bin/mono 或/usr/bin/mono。

例如:

System.Diagnostics.Process.Start("/usr/bin/local/mono /Users/Ilya/Projects/SomeApp.exe");

显然您会使用.exe 文件的实际路径,以上只是一个示例。

【讨论】:

  • 如果你想用chrome打开一个html页面,你是怎么做的呢?我试过 System.Diagnostics.Process.Start("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome SubDB.html");但这不起作用。
  • 如果 chrome 是您的默认浏览器,那么只需 Process.Start(path/to/html/file) 就可以了
【解决方案2】:

要扩展 Bryan 的答案,请在您的代码中不要硬编码路径 /usr/bin/local/。

要找出每个系统中的正确路径,有多种技术,但我不确定哪个是最好的:

  • 使用which mono 定位完整路径。为此,您需要从另一个 Process 实例调用 which。 (不确定which 是否默认出现在所有 Mac 系统中)
  • 使用 pkg-config 确定安装 Mono 的前缀。但要注意,你不能简单地调用系统的 pkg-config,你必须先检查 mono 的 pkg-config 是否存在。为此,您需要检查此硬编码路径是否存在:/Library/Frameworks/Mono.framework/Versions/Current/bin/pkg-config(就像它已完成 here)。

【讨论】:

  • 在 OS X 上,它实际上应该是 /Libraries/Frameworks/Mono.framework/Versions/Current/bin/mono - btw。恕我直言,而不是发布单独的答案,您应该建议对此类内容进行编辑,您只是在现有答案中添加内容。
  • 这是一个很好的观点。如果这是一个用户应用程序,我强烈建议使用which mono 方法。如果它是服务器端,那么您可能希望将单声道的路径设置为配置设置。
【解决方案3】:

Mono 鲜为人知的特性是您可以直接运行 .exe 文件(以兼容它在 Windows 中的执行方式,但也是为了方便)。它使用启动原始可执行文件的同一个 Mono VM 启动。换句话说,一个人可以简单地做:

Process.Start("Test.exe");

好吧,至少它适用于我的 Linux ;)

编辑:

这是该功能的source,应该适用于所有平台。

【讨论】:

  • 一个重要提示:目标 EXE 文件需要设置可执行位,否则 Mono 将拒绝启动该程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
相关资源
最近更新 更多