1

MonoMac アプリケーションに組み込まれたブラウザーから Silverlight 5 アプリケーションにアクセスする必要があります。たとえば、Silverlightアプリケーションにアクセスしようとすると、MonoMac.WebKit.WebViewを使用しているブラウザーの場合

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

次のエラーが表示されますhttp://pastebin.com/s8PDfDyq。XCodeのネイティブWebViewで同じことを試してみましたが、正しくロードされるので、モノブリッジが影響していると思います。

WebView 以外に、Mono OSX アプリケーションにブラウザーを埋め込むための他の方法はありますか?

ありがとう、クラウディオ

4

2 に答える 2

5

何度も Web を検索してさまざまなことを試した結果、最新の MonoDevelop で問題なく動作するようになりました。ここには、実際には 2 つの別個の問題があります。1 つ目は、私のテストでは OSX 10.6 以降に影響します (10.5 にはアクセスできません)。2 つ目は、OSX 10.7 以降に影響します。

  1. 多くの Silverlight Web サイトは、OSX 10.6 でも 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. この修正を行っても、最新の MonoDevelop webView + OSX 10.7 以降の Silverlight = クラッシュします。なんで?Silverlight プラグインには、10.7 以降のヒープ実行セキュリティに関する問題があるようです。MonoDevelop 2.8.8.4 は unix 実行可能ファイルにヒープ実行を防止するフラグを設定しませんでしたが、最新の MonoDevelop は設定します。MonoDevelop から、ld に渡されるパラメーターを変更して -allow_heap_execute を実行する場所に到達できるかどうかはわかりません。ただし、16進エディタを使用して、appbundleのunix実行可能ファイルでフラグを自分で変更できます...

    HexFiend を入手して、アプリケーション フォルダに入れました。出力アプリ バンドルのコンテンツを (右クリックして) 表示し、 Contents/MacOS/ を掘り下げます。そこに1つのファイルがあります。HexFiendで開きます。次のようなバイトが表示されます。

    CEFAEDFE 07000000 03000000 02000000 13000000 3C080000 85002001
    

    最後の 1 を参照してください。それはノーヒープ実行フラグです。1 を 0 に変更してオフにします。これにより、Silverlight を含むページを示す webView が 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 の更新されたバージョンでさまざまな問題を抱えている人々のあらゆる種類の検索結果にたどり着きました。

これが私の答えに役立つリンクです:

Silverlight と同じスタックで Firefox がクラッシュし、修正時にヒープ保護機能がオフになっていました。

ヒープ実行が許可されているプロセス外で Silverlight プラグインを実行することで問題が解決された、リンクされた Firefox のクラッシュ

ヘッダーのフラグに関する Apple リソース

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 に答える