12

我成功地使用 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");

有任何想法吗?我真的很感激任何帮助。

谢谢!

4

3 回答 3

18

您需要做的是使用实际可执行文件的完整路径。在 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 单击)应用程序,然后选择Show Package Contents,这将在 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文件的实际路径,上面只是一个例子。

于 2013-03-17T05:49:52.863 回答
0

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

Process.Start("Test.exe");

好吧,至少它在 Linux 上对我有用;)

编辑:

这是该功能的来源,应该适用于每个平台。

于 2013-03-18T14:46:14.713 回答
0

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

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

  • 用于which mono定位完整路径。为此,您需要which从另一个 Process 实例调用。(不确定是否which所有 Mac 系统都默认提供)
  • 使用 pkg-config 确定安装 Mono 的前缀。但要注意,你不能简单地调用系统的 pkg-config,你必须先检查 mono 的 pkg-config 是否存在。为此,您需要检查此硬编码路径是否存在:(/Library/Frameworks/Mono.framework/Versions/Current/bin/pkg-config就像在此处完成的那样)。
于 2013-03-17T13:09:43.060 回答