微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vb.net – 具有Late Bind对象/属性名称的WebBrowser问题

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

例如:

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

将使用多个Webbrowser控件实例失败

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

Member not found. (Exception from HRESULT: 0x80020003 (disP_E_MEMBERNOTFOUND))
at Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o,Type objType,
String name,Object[] args,String[] paramnames,Boolean[] copyBack)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance,
Type Type,String MemberName,Object[] Arguments,String[] ArgumentNames,
Type[] TypeArguments,Boolean[] copyBack)
at Execute() in C:\Projects\Webbrowser\SampleCall.vb:line 16

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

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

编辑:此代码与以下内容混合:选项严格关闭

解决方法

@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方法,您会发现BindingFlags.IgnoreCase标志用于binder.InvokeMember调用.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐