单声道和窗口。外部

时间:2009-07-05 21:25:37

标签: .net mono webbrowser-control

这将是通过ClickOnce部署的Windows窗体应用程序。 计划是使用WebBrowser控件来公开使用Active-X控件的Web应用程序。使用window.external和InvokeScript,对象将被替换为对Reg-Free COM对象(SXS)的引用。我知道这听起来像是一团糟,但它是一个较小的邪恶,我的时间紧迫。最终,可以替换SXS部分,并希望服务器端代码可以更好地更新。 这会有严重的性能问题吗?我要求多少麻烦?

针对.NET 2.0,是否可以更轻松地获得可在Mono和.NET之间移植的代码? 移植到Mono的VB.NET代码是否麻烦?我假设它不应该是? (我正在与VB6程序员合作)。

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

我有其他计划慢慢使代码更容易移植,我希望我可以将它作为一种方法(读取:漏洞)使其成为可能。

如果你有关于态度和心态的建议,我也很乐意听到。但请先尝试回答我的主要问题。谢谢。

2 个答案:

答案 0 :(得分:4)

这是在.NET WebBrowser控件中模拟windows.external的黑客攻击:

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

  

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

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

  

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

拦截并取消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语句。

答案 1 :(得分: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。)