经过大量的网络搜索和尝试不同的事情后,我能够在最新的 MonoDevelop 中运行。这里实际上有两个不同的问题。第一个在我的测试中影响 OSX 10.6 及更高版本(无法访问 10.5)。第二个影响 OSX 10.7 及更高版本。
即使在 OSX 10.6 中,许多 silverlight 网站也会在 webView 中崩溃。您可以通过更改用户代理来修复崩溃
webBrowser.CustomUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2";
很难相信这能解决问题,但它确实做到了,即使没有这个的 useragent 字符串非常相似:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko)
即使使用此修复程序,OSX 10.7 或更高版本上的最新 MonoDevelop webView + Silverlight = 崩溃。为什么?在 10.7 及更高版本中,silverlight 插件似乎存在堆执行安全问题。MonoDevelop 2.8.8.4 没有在 unix 可执行文件上设置标志以防止堆执行,但最新的 MonoDevelop 确实如此。从 MonoDevelop 中,我不知道您是否可以将传递给 ld 的参数更改为执行 -allow_heap_execute。但是您可以使用十六进制编辑器在 appbundle 中的 unix 可执行文件中自己修改标志...
我抓住了HexFiend,然后把它放在我的应用程序文件夹中。显示输出应用程序包的内容(通过右键单击),然后深入 Contents/MacOS/ 。那里会有一个文件。在 HexFiend 中打开它。你会看到这样的字节:
CEFAEDFE 07000000 03000000 02000000 13000000 3C080000 85002001
看到最后一张了吗?那是无堆执行标志。通过将 1 更改为 0 来关闭它。这让我的 webView 显示了带有 Silverlight 的页面,可以在 OSX 10.8 上顺利运行
我最终编写了一个小的单控制台应用程序,我称之为后期构建步骤来为我执行此操作。它被调用为
mono "<path-to-console-app-exe>" "<path-to-mac.app-package>"
这是主要功能:
public static void Main (string[] args)
{
if (args.Length > 0)
{
if (Directory.Exists(args[0]))
{
string containingFolder = Path.Combine (Path.Combine(args[0], "Contents"), "MacOS");
var files = Directory.GetFiles (containingFolder);
if (files.Length == 1)
{
var bytes = File.ReadAllBytes(files[0]);
byte one = (byte)1;
byte allButOne = (byte)~one;
bytes[27] = (byte)(bytes[27] & allButOne);
File.WriteAllBytes(files[0], bytes);
return;
}
}
}
throw new InvalidOperationException("Failed to allow heap execution");
}
就其价值而言,Mac 上的 Silverlight 似乎是一个非常脆弱的提议。我真的没有一个短期的选择,你可能也没有,但弄清楚这一点让我浏览了各种搜索结果,这些结果显示人们对 Silverlight 和 OSX 的更新版本有各种问题。
以下是帮助我找到答案的链接:
Firefox 与 silverlight 和相同的堆栈崩溃,在修复时考虑关闭堆保护的东西
通过在允许堆执行的进程外运行 silverlight 插件解决了问题的链接 Firefox 崩溃
标题中标志上的 Apple 资源
Chromium 错误实际上列出了堆执行的标志 - 不是在苹果的文档中 - 太棒了!
在 Connect 上提交的关于通过更改用户代理字符串修复的崩溃的错误 1
在 Connect 上提交的关于通过更改用户代理字符串修复的崩溃的错误 2