在Mac上使用C#启动外部进程

12

我成功地使用System.Diagnostics.Process.Start()在Windows上启动我的外部mono可执行文件。但是在Mac上失败了。我没有得到任何错误,仅仅什么都没有发生。

我尝试以以下方式进行:

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

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

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

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

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

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

谢谢!


@konrad.kruczynski 这对我不起作用。实际上,我甚至尝试启动实际的mono可执行文件“/Libraries/Frameworks/Mono.framework/Versions/2.*/bin/mono”。该文件存在,但调用System.Diagnostics.Process.Start却毫无反应。我唯一能够使用Process.Start启动的是“open -a Terminal”。 - Ilya Suzdalnitski
它在我的电脑上运行正常,可能是一个 bug(或旧的 Mono 版本之类的问题)。请不要犹豫,在这里创建一个错误报告:http://bit.ly/qFa0pT - konrad.kruczynski
3个回答

18

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

例如,要打开终端:

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

或者对于TextEdit:

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

为了找到可执行文件,您可以右键单击(或控制键单击)应用程序,然后选择“显示包内容”,这将在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");但是这并没有起作用。 - Carlos Borges
如果Chrome是您的默认浏览器,那么简单地使用Process.Start(path/to/html/file)应该就可以工作了。 - DJ001

0

在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(就像这里所做的那样)。

在OS X上,实际上应该是/Libraries/Frameworks/Mono.framework/Versions/Current/bin/mono - 顺便说一句,在这种情况下,你应该提出一个编辑建议,而不是发布一个单独的答案来添加内容。 - Martin Baulig
这是一个很好的观点。如果这是一个用户应用程序,我强烈建议使用“which mono”方法。如果它是服务器端,则可能需要将mono路径设置为配置设置。 - rossipedia

0
Mono的一个鲜为人知的特性是你可以直接运行.exe文件(以便与Windows中的操作方式兼容,也为了方便)。它使用启动原始可执行文件的相同Mono VM启动。换句话说,你可以简单地执行以下操作:
Process.Start("Test.exe");

嗯,至少在Linux上对我有效 ;)

编辑:

这是源代码的链接,应该在任何平台上都有效。


一个重要的注意事项:目标EXE文件需要设置可执行位,否则Mono将拒绝启动该程序。 - LubosD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接