1

我需要从嵌入 MonoMac 应用程序的浏览器访问 silverlight 5 应用程序。对于浏览器,我正在使用 MonoMac.WebKit.WebView 例如,当尝试访问任何 silverlight 应用程序时

webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://samples.msdn.microsoft.com/Silverlight/SampleBrowser/")));

我收到以下错误http://pastebin.com/s8PDfDyq。我对 XCode 中的本机 WebView 进行了同样的尝试,它正确加载,所以我相信是影响它的单声道桥。

除了 WebView 之外,还有其他方法可以将浏览器嵌入到 Mono OSX 应用程序中吗?

谢谢,克劳迪奥

4

2 回答 2

5

经过大量的网络搜索和尝试不同的事情后,我能够在最新的 MonoDevelop 中运行。这里实际上有两个不同的问题。第一个在我的测试中影响 OSX 10.6 及更高版本(无法访问 10.5)。第二个影响 OSX 10.7 及更高版本。

  1. 即使在 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)
    
  2. 即使使用此修复程序,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

于 2012-10-22T19:40:18.813 回答
0

为了帮助...我们现在遇到了完全相同的问题。

特别有趣的是,我们在旧版本的 MonoDevelop+MonoMac (2.8.8.4) 中使用了这个功能。我们最近升级到最新的 MonoDevelop 以纠正一些其他问题,现在看到了这个问题。

同样有趣的是,崩溃似乎只发生在 OSX 10.7 及更高版本上。我们的应用程序在 OSX 10.6 机器上运行良好......

在研究崩溃堆栈时,我遇到了一些引起我注意的有趣的事情,但到目前为止我对它们一无所知。一个是

https://bugzilla.mozilla.org/show_bug.cgi?id=753248

Silverlight 在哪里使 Firefox 崩溃,但仅在 OSX 10.7 及更高版本上,具有非常相似的堆栈。

于 2012-10-19T21:36:58.237 回答