5

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

例如:

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

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

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

未找到成员。(来自 HRESULT 的异常:0x80020003 (DISP_E_MEMBERNOTFOUND))在 Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack) 在 Microsoft.VisualBasic。 CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack) 在 C:\Projects\WebBrowser\SampleCall.vb 中的 Execute() :第 16 行

这个问题有什么解决方案吗?

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

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

4

2 回答 2

2

@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 未能找到正确的成员。

于 2010-08-19T07:01:54.787 回答
0

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

于 2010-08-18T20:32:13.233 回答