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。 C:\Projects\WebBrowser\SampleCall.vb の Execute() での CompilerServices.NewLateBinding.LateGet (Object Instance、Type Type、String MemberName、Object[] Arguments、String[] ArgumentNames、Type[] TypeArguments、Boolean[] CopyBack) :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"

多くのコードを変更して再テストする必要があるこのアプローチの問題

Reflector ユーティリティを使用して Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet メソッドを調べると、BindingFlags.IgnoreCase フラグが binding.InvokeMember 呼び出しで使用されていることがわかります。

この呼び出しが COM を介して行われることはよくわかりませんが、COM 相互運用機能がルックアップ テーブルで 1 つのバージョンの名前を使用していることをどこかで読んでいました。パラメータ名が最初にそのテーブルに「MyControl」として入力された場合と同様に、「mycontrol」ではなく、このバージョンが使用されます。そのため、後で InvokeMember が正しいメンバーを見つけられなかったと思います。

于 2010-08-19T07:01:54.787 に答える
0

別の方法で値を設定してみてください。
WebBrowser1.Document.Forms("Myform").children("mycontrol").Value = "test"

于 2010-08-18T20:32:13.233 に答える