【问题标题】:Mono and window.externalMono 和 window.external
【发布时间】:2009-07-05 21:25:37
【问题描述】:

这将是一个通过 ClickOnce 部署的 Windows 窗体应用程序。 计划是使用 WebBrowser 控件来公开使用 Active-X 控件的 Web 应用程序。使用 window.external 和 InvokeScript,这些对象将被替换为对 Reg-Free COM 对象 (SXS) 的引用。我知道这听起来像一团糟,但它的危害较小,而且我的日程安排很紧。最终,可以替换 SXS 部分,并希望服务器端代码可以更新为更好的东西。 这会产生严重的性能问题吗?我问这个问题有多大?

以 .NET 2.0 为目标是否会更容易在 Mono 和 .NET 之间移植代码? VB.NET 代码移植到 Mono 是否麻烦?我假设它不应该是? (我正在与 VB6 程序员一起工作)。

文档说 window.external 在 Mono 下不可用。听起来有计划实施。现在只使用 window.external 并等待 Mono 实现它是否安全? 或者,有没有办法模仿这个?

我还有其他计划要慢慢使代码更便携,我希望我可以将其用作一种方法(阅读:漏洞)以使其成为可能。

如果您对态度和心态有任何建议,我也很乐意听到。但请先尝试回答我的主要担忧。谢谢。

【问题讨论】:

  • 请添加更多细节。当脚本在 Windows 窗体 WebBrowser 控件中运行时,无需阅读标记即可知道您在询问 JavaScript 中“窗口”对象的“外部”属性。

标签: .net mono webbrowser-control


【解决方案1】:

这是在 .NET WebBrowser 控件中模拟 windows.external 的技巧:

在您放入 webbrowser 控件的 javascript 代码中,封装您对 window.external 的调用(例如):

function wex() { window.external.WBEvent(arguments[0], arguments[1]);返回假; }

更改导航功能,但使用您自己的协议:

function wex() { location.href = 'wex://DOMAIN//' + arguments[0] + '//' + arguments[1];返回假; }

在 Visual Basic 代码中拦截并取消导航:

  Private Sub WebBrowser_Navigating(ByVal sender As Object, _
             ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) _
             Handles WebBrowser.Navigating

    With e
        If .Url.AbsoluteUri.StartsWith("wex://") Then
            Dim str As String = HttpUtility.UrlDecode(.Url.AbsoluteUri)
            Dim pos As Integer = InStr(14, str, "//")
            WBEvent(Mid(str, 15, pos - 15), Mid(str, pos + 2))
            'Debug.Print("wex " & Mid(str, 15, pos - 15) & " " & Mid(str, pos + 2))
            e.Cancel = True
        End If
    End With
End Sub

DOMAIN 将被转换为小写。这就是它被忽略的原因。

如果您有多个函数,则将其作为 uri 的第一部分并在导航事件代码中执行 select 语句。

【讨论】:

  • 这会导致浏览器控件的 Document 属性被清除。这使得无法使用 Document.InvokeScript 回调脚本。当然,只有单声道。有什么建议吗?
【解决方案2】:

我不完全理解你想要做什么,但我看到了我可以回应的具体词:

  • Mono 不支持 ClickOnce。
  • Mono 不支持 ActiveX。有一些COM的东西,但我不知道它有多完整。
  • Mono 的 WebBrowser 控件支持基本操作,但是 window.external 是非常高级的功能,它非常特定于 IE。目前没有对 WebBrowser 控件进行任何工作,而且我认为这种情况不会很快发生变化,除非有人贡献了您需要的东西。

以 .NET 2.0 为目标是否会让代码更容易在 Mono 和 .NET 之间移植?

我认为这与针对 .NET 3.5 而不是 .NET 1.1 是相反的。 .NET 2.0 类库比 .NET 3.0/3.5 的类库要完整得多(没有 WPF,没有 WF,WCF 有限)。但是,如果您只需要像 LINQ 这样的 C# 3 功能,那么所有 C# 3 都应该可以正常工作。

VB.NET 代码移植到 Mono 是否麻烦?

在 Mono 上,C# 肯定比 VB.Net 得到更好的支持。 VB.Net 编译器当前版本为 8.0 (2005)。 VB.Net 运行时类库也不完整。 (尽管您可以完全避免这种情况并仍然使用 VB.Net。)

【讨论】:

  • ClickOnce 没什么大不了的,ActiveX 也不是。这一切最终都会被托管代码所取代,如果我要尝试在 Mono 上部署它,它可能只是一个安装程序(捆绑了 Mono)。 WebBrowser 控件没有投入任何工作似乎意味着我希望使该部分可移植是一个失败的原因。
  • 我破解 Mono 的 WebBrowser 部分的可能性有多大。 Mono 的那部分现在是不是一团糟?至少有用吗?
  • 对不起,我没有说清楚。 WebBrowser 的基本功能有效,但 window.external 无效。查看 window.external 的作用,它似乎是特定于 IE 的。 Mono 的 WebBrowser 控件使用 Gecko (Mozilla) 作为后端。
猜你喜欢
  • 2013-09-06
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2014-06-22
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多