渲染Silverlight网站时WebView崩溃

时间:2012-08-30 20:37:41

标签: macos silverlight mono

我需要从嵌入在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应用程序中嵌入浏览器吗?

谢谢, 克劳迪奥

2 个答案:

答案 0 :(得分:5)

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

  1. 即使在OSX 10.6中,许多silverlight网站也会在webView中崩溃。您可以通过更改useragent来解决崩溃问题

    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";
    

    很难相信这个固定的东西,但确实如此,即使没有这个的使用者字符串非常相似:

    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 =崩溃。为什么?似乎silverlight插件在10.7及更高版本中存在堆执行安全性问题。 MonoDevelop 2.8.8.4没有在unix可执行文件上设置标志以防止堆执行,但最新的MonoDevelop确实如此。从MonoDevelop,我不知道你是否可以到达一个地方,你改变传递给ld的参数来做-allow_heap_execute。但是您可以使用十六进制编辑器在appbundle中的unix可执行文件中自行修改标志...

    我抓住HexFiend然后将其放入我的应用程序文件夹中。显示输出应用程序包的内容(通过右键单击),然后深入内容/ MacOS /。那里会有一个文件。在HexFiend中打开它。你会看到这样的字节:

    CEFAEDFE 07000000 03000000 02000000 13000000 3C080000 85002001
    

    看到最后1?那是无堆执行标志。通过将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");
    }
    
  3. 对于它的价值,Silverlight on Mac似乎是一个非常脆弱的主张。我真的没有一个短期的选择,你可能也没有,但是解决这个问题让我了解了各种各样的搜索结果,包括Silverlight和OSX的更新版本。

    这些链接帮助了我的答案:

    Firefox crash with silverlight and same stack where on fix considered was turning off the heap protection stuff

    Linked firefox crash where problem was resolved by running silverlight plugin out of process where heap execution is allowed

    Apple resource on the flags in the header

    Chromium bug that actually lists what flag is the heap execute one - not in apple's docs - awesome!

    Bug 1 filed on Connect about the crash fixed by changing the user agent string

    Bug 2 filed on Connect about the crash fixed by changing the user agent string

答案 1 :(得分: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及更高版本,堆栈非常相似。