使用c#在mac上启动外部进程

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

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

谢谢!

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

例如,打开终端:

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

或者对于TextEdit:

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

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

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

例如:

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

显然你会使用.exe文件的实际路径,上面只是一个例子。

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

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

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

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

 Process.Start("Test.exe"); 

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

编辑:

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