我需要从嵌入在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应用程序中嵌入浏览器吗?
谢谢, 克劳迪奥
答案 0 :(得分:5)
经过大量网络搜索和尝试不同的事情后,我能够在最新的MonoDevelop中使用。这里实际上有两个不同的问题。第一个影响我的测试中的OSX 10.6及更高版本(无法访问10.5)。第二个影响OSX 10.7及更高版本。
即使在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)
即使使用此修复程序,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");
}
对于它的价值,Silverlight on Mac似乎是一个非常脆弱的主张。我真的没有一个短期的选择,你可能也没有,但是解决这个问题让我了解了各种各样的搜索结果,包括Silverlight和OSX的更新版本。
这些链接帮助了我的答案:
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及更高版本,堆栈非常相似。