【问题标题】:WebBrowser Issue with Late Bind object/property names后期绑定对象/属性名称的 WebBrowser 问题
【发布时间】:2010-08-13 07:23:34
【问题描述】:

使用与对象/属性名称生成相关的 WebBrowser 后期绑定调用存在问题。

例如:

WebBrowser1.Document.DomDocument.Forms.Myform.mycontrol.Value = "test"

会因多个 WebBrowser 控件实例而失败

实际发生的是 mycontrol 对象变成 Mycontrol 并且编译的 vb.net 应用程序将失败并出现错误

未找到成员。 (来自 HRESULT 的异常:0x80020003 (DISP_E_MEMBERNOTFOUND)) 在 Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(对象 o,类型 objType, 字符串名称,对象 [] 参数,字符串 [] 参数名称,布尔 [] CopyBack) 在 Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(对象实例, 类型类型、字符串成员名称、对象 [] 参数、字符串 [] 参数名称、 Type[] TypeArguments, Boolean[] CopyBack) 在 C:\Projects\WebBrowser\SampleCall.vb:line 16 中的 Execute() 处

这个问题有解决办法吗?

相同的代码将适用于具有多个 WebBrowser 控件的 vb6 应用程序

编辑:此代码编译为:Option Strict Off

【问题讨论】:

    标签: vb.net browser late-binding


    【解决方案1】:

    @bugtussle

    接下来的任务将起作用:

    WebBrowser1.Document.Forms("Myform").Children("mycontrol").InnerText = "test"
    WebBrowser1.Document.DomDocument.Forms("Myform").all("mycontrol").Value = "test"
    WebBrowser1.Document.DomDocument.Forms.Myform.all.mycontrol.Value = "test"
    

    这种方法的问题是需要更改和重新测试大量代码

    如果您使用反射器实用程序查看 Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet 方法,您会发现在 binder.InvokeMember 调用中使用了 BindingFlags.IgnoreCase 标志。

    我不知道这个调用是通过 COM 完成的,并且在某个地方读取到 COM 互操作在查找表中使用了一个版本的名称。就像参数名称最初作为“MyControl”输入到该表中一样,则将使用此版本,而不是“mycontrol”。我认为因为后来 InvokeMember 未能找到正确的成员。

    【讨论】:

      【解决方案2】:

      尝试以不同的方式设置值:
      WebBrowser1.Document.Forms("Myform").children("mycontrol").Value = "test"

      【讨论】:

        猜你喜欢
        • 2011-07-20
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 2016-06-21
        • 1970-01-01
        • 2011-09-01
        • 2011-06-24
        相关资源
        最近更新 更多