在MAC OS X El Capitan上安装Mono:LSOpenURLsWithRole

3

我有一款.NET软件,可以在Linux和MAC上使用Mono运行。该软件使用Macpack在OSX Lion上的Mono 3.6.0中打包为.app,并使用PackageMaker创建安装程序。在所有新版本的OSX上都可以正常工作,直到El Capitan触发以下错误:

LSOpenURLsWithRole() failed with error -10810 for the file .../Applications/MyApp.app

我已经将开发文件移至El Capitan,并使用Mono 4.0.4.4进行打包,使用Macpack。当使用它时,似乎不会显示该错误。
open -a MyApp.app

现在唯一的问题是无法双击启动。该软件已通过安装程序安装在 /Applications 中。使用 open 命令从控制台可以正常启动,但是双击无效。是否有一种方法可以在控制台中模拟双击以查看错误或其他信息?
PS. 在 El Capitan 上,似乎只有最新的 4.0.4.4 或为 El Capitan 设计的 4.2.1 Mono 框架可以正常工作。二进制文件的新位置位于 /usr/local/bin 而不是 /usr/bin,这仅在安装之前存在 /usr/local/bin 的情况下才有效,否则 mono 命令将无法识别。
谢谢。

回复:Mono版本;没错,4.0.4.4或4.2.1是El Capitan支持的版本。从/usr/bin到/usr/local/bin的转移是El Capitan的要求,因为第三方不应该修改/usr/bin中的任何内容。在全新安装之前,/usr/local/bin不存在的问题是已知的问题。 - SushiHangover
关于你的启动问题,你有查看过 Console.app 吗?双击期间是否报告了任何错误?可能是权限问题,应用程序包中的启动器二进制文件是否具有正确的权限,并且应用程序包本身是否被标记为可执行文件? - SushiHangover
3个回答

2

我也遇到了同样的问题(在El Capitan上),以下是我的解决方案(使用Mono 4.2.1):

1)创建一个空脚本并替换macpack创建的脚本(例如:KeePass.app/Contents/MacOS/KeePass)

2)对于mono和exe文件,请使用完整路径

#!/bin/sh
DIR=$(cd "$(dirname "$0")"; pwd) 
/usr/local/bin/mono $DIR/../Resources/KeePass.exe

我认为这与系统完整性保护(csrutil)有关,但不确定。


这是一个临时解决方案,仅适用于El Capitan:/usr/local/bin/mono“$ASSEMBLY”。如果您想在以前的版本上运行它,您必须将mono路径更改为/usr/bin/mono... - Daniel Bogdan
1
系统完整性保护不允许您运行“which”,因为它位于/usr/bin中。 - rcruzs00
好的,那么我们可以使用什么替代which来定位mono呢?因为它可能会根据OSX版本在两个不同的位置。 - Daniel Bogdan
1
如果 [ -f /usr/local/bin/mono ]; then - rcruzs00

1

LSOpenURLsWithRole()出现错误-10810,文件为.../Applications/MyApp.app

听起来可能是权限问题,但-10810可以有很多含义,我从未见过对该错误号的响应是确定其原因的(它从PowerPC时代就存在)。已指向权限、外部驱动器访问和实际的启动服务守护程序。

  • 重新启动(或手动终止并重新生成这些服务,包括Finder/Spotlight)
  • ls -l /Application/YourApp.app 并检查其是否被标记为可执行
  • ls -l /Application/YourApp.app/Contents/MacOS/YourApp 并检查其是否被标记为可执行
  • 打开Console.app并重试双击您的应用程序,并查看记录的警告/错误。
  • ...

要升级到El Capitan吗?那么您需要Mono版本4.2.x或4.0.4.4。

来自Mono邮件列表:

最新的Mono 4.0.4.4包和4.2.1 El Capitan预览版有什么区别?4.0.4.4的变更日志中包括“33585:El Capitan系统完整性保护支持”。因此,我认为4.0.4.4也适用于El Capitan?Miguel de Icaza回复说:其中一个基于Mono 4.0系列,只进行了最小的更改以启用对El Capitan的支持;4.2在最新的Mono 4.2之上具有相同的更改,可用于Alpha和发布候选版。参考链接:http://sushihangover.github.io/osx-10-dot-11-el-capitan-which-mono-version/

Daniels-MBP:sca daniel$ cd /Applications/ Daniels-MBP:Applications daniel$ ls -l MyApp.app/ 总用量 0 drwxrwxr-x 5 root admin 170 10月 16 13:25 Contents Daniels-MBP:Applications daniel$ ls -l MyApp.app/Contents/MacOS/ 总用量 8 -rwxrwxr-x 1 root admin 1411 10月 16 13:11 MyApp - Daniel Bogdan
错误127表示找不到命令/文件;你的启动应用程序(在应用程序包内)是否为脚本?它是否硬编码为在/usr/bin中查找mono或其他路径? - SushiHangover
另外,由于这是错误127,请检查您的应用程序包中是否有一些被访问的文件具有错误的权限...也许在ElCap升级期间某个系统文件被标记为错误,请尝试使用磁盘工具并对该卷执行错误修复磁盘权限操作。 - SushiHangover
macpack的gen'd脚本可能是问题所在,将mono链接(ln)到bin目录中可能是问题所在。删除bin目录中的mono符号链接,以便可以重新创建它来正确找到mono。 - SushiHangover
错过了这个(我在PST时区),我得走了,如果你还需要帮助,明天再试试吧。 - SushiHangover
显示剩余5条评论

1

由于目前还没有解决方法,您可以使用这个临时解决方案。在使用macpack打包后,打开应用程序文件夹,进入/Contents/MacOS并编辑启动脚本中的最后一个if else语句:

MONO_PATH="/usr/bin/mono"

cd "$APP_PATH/Contents/Resources"

if [ "$X11_MODE" -eq "1" ]; then
        open-x11 "$APP_NAME"
else
        if [ -f "/usr/local/bin/mono" ]; then MONO_PATH="/usr/local/bin/mono" ; fi
        "$MONO_PATH" "$ASSEMBLY"
fi

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