前天应邀在.NET下处理HTML DOM,就按照原来VB中的写:
Dim document = WebBrowser1.Document.DomDocument
MsgBox(document.getelementbyid(“aaaaa”).innerhtml)
工作很正常。然而同学却不懂VB,就翻译成C#,写成
Object document = WebBrowser1.Document.DomDocument
document.getelementbyid(“aaaaa”).innerhtml
结果没法通过编译。网上搜了下,有人说把Object换成var,试了下也不行。
后来查了下MSDN中C#的入门,提到了“C#是强类型语言”,所以,像脚本那样访问DOM是不行的,必须要Cast以后才行,方始发现原来VB和C#还是不一样的啊。
然而.NET终归是一种语言,VB和C#的这个差别在.NET上会是什么样的呢。大家都知道,.NET的母语是C#,换句话说.NET IL也是强类型语言,所以推测是VB的编译器做了手脚。
用Reflactor打开VB编译的EXE,果然不出所料。
如下面的代码:
Dim document = WebBrowser1.Document.DomDocument
document.parentwindow.execscript("alert(jQuery(""table:eq(1) tr:gt(0) td:nth-child(2)"").text());", "javascript")
在Reflactor中变成了:
NewLateBinding.LateCall(NewLateBinding.LateGet(RuntimeHelpers.GetObjectValue(Me.WebBrowser1.Document.DomDocument), Nothing, "parentwindow", New Object(0 – 1) {}, Nothing, Nothing, Nothing), Nothing, "execscript", New Object() { "alert(jQuery(""table:eq(1) tr:gt(0) td:nth-child(2)"").text());", "javascript" }, Nothing, Nothing, Nothing, True)
这么看来VB.NET支持IDispatch的后期绑定,倒是比C#还技高一筹哈哈