MAC OS X El Capitan 上的单声道:LSOpenURLsWithRole

Mono on MAC OS X El Capitan: LSOpenURLsWithRole

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

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

我已经将开发文件移到 El Capitan 上,并设法用 MacpackMono 4.0.4.4 打包它。使用

时似乎没有显示该错误
open -a MyApp.app

现在唯一的问题是双击不启动。该软件由安装程序安装在 /Applications 中。它可以从控制台使用 open 命令正常启动,但不能双击。有没有一种方法可以通过从控制台模拟双击来查看错误或其他内容?

PS。同样在 El Capitan 上,似乎唯一可用的 Mono 框架是最新的 4.0.4.4 或为 El Capitan 设计的 4.2.1。二进制文件的新位置在 /usr/local/bin 而不是 /usr/bin 中,这仅在安装前存在 /usr/local/bin 时有效,否则将无法识别单声道命令。

谢谢

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

听起来可能是权限问题,但 -10810 可能意味着很多事情,而且我从未见过对原始错误编号的明确响应(自 PowerPC 时代以来就存在)。已指向权限、外部驱动器访问和实际启动服务守护程序。

  • 重新启动(或手动终止并重新生成这些服务,包括 Finder/Spotlight)
  • ls -l /Application/YourApp.app 并检查它是否被标记为可执行文件
  • ls -l /Application/YourApp.app/Contents/MacOS/YourApp 并检查是否标记为可执行文件
  • 打开 Console.app 并再次尝试双击您的应用并查看 warnings/errors 已记录的内容。
  • ...

搬到埃尔卡皮坦?那么你需要 Mono 版本 4.2.x 或 4.0.4.4.

来自 Mono 邮件列表:

What is the difference between the latest Mono 4.0.4.4 package for Mac and the 4.2.1 El Capitan Preview? The changelog of 4.0.4.4 includes “33585: El Capitan System Integrity Protection support.” so i suppose that the 4.0.4.4 also works on El Capitan?.

Miguel de Icaza 的回复:

One is based on Mono 4.0 series, with minimal changes just to enable the support on El Capitan; The 4.2 has the same changes, on top of the latest Mono 4.2, available on Alpha and the release candidate.

参考:http://sushihangover.github.io/osx-10-dot-11-el-capitan-which-mono-version/

同样的问题(El Capitan)。我就是这样解决的(Mono 4.2.1)

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

2) 为单声道和 exe 文件使用完整路径

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

我认为这在某种程度上与系统完整性保护 (csrutil) 有关,但不确定。

由于尚无修复程序,您可以使用此临时修复程序。使用 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