开发者

WebBrowser Issue with Late Bind object/property names

There are issue with using WebBrowser late bind calls related to object/property names generation.

For example:

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

will fail with more than one instance of the WebBrowser control

what actually happen is that mycontrol object become Mycontrol and compiled vb.net application will fail with error

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开发者_如何学Python, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack) at Execute() in C:\Projects\WebBrowser\SampleCall.vb:line 16

Is there are any solutions for this issue?

Same code will work with vb6 app with multiple WebBrowser controls

Edit: This code is comipled with: Option Strict Off


@bugtussle

Next assignments will work:

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"

The problem with this approach that is required to change and retest a lot of code

If you take a look into Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet method using reflector utility, you can find that BindingFlags.IgnoreCase flag is used in binder.InvokeMember call.

I do undestant that this call is done through COM, and was reading somewhere that COM interop is using one version of name in a lookup table. Like if parameter name was initially entered into that table as "MyControl" than this version will be used, not "mycontrol". I think because of that later on InvokeMember is failing to find correct member.


Try setting the value a different way:
WebBrowser1.Document.Forms("Myform").children("mycontrol").Value = "test"

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜