私は、(サードパーティが提供する) Web アプリとやり取りして追加機能 (メニュー項目の削除、ページからの情報のプルなど) を提供する vb.net アプリケーションに取り組んでいます。Web アプリは完全に javascript によって駆動されますが、asp.net でホストされ、Internet Explorer でのみ使用されます。
javascript オブジェクトからプロパティを読み取り、その関数の一部を実行しようとしています。スクリプトが存在する iframe の mshtml.HTMLDocument を取得し、次のコードを使用して、javascript オブジェクトを取得することができました。
Dim jsObject as Object
jsObject = htmldoc.Script.jsObject
jsObject は {System.__ComObject} として存在し、それを使用して、次のように関数を実行したり、プロパティを読み取ったりできます。
Dim value as String = jsObject.FunctionThatReturnsAString()
jsObject.FunctionTHatDoesSomethingInWebApp("Param1", "Param2")
これはうまくいきます。ただし、jsObject を含むページ/フレームを離れてそこに戻ると、フレームから JavaScript オブジェクトを再度取得する (つまり、次の行を実行する) ときに、同じコードが例外をスローします。
jsObject = htmldoc.Script.jsObject
例外: メンバーが見つかりません。(HRESULT からの例外: 0x80020003 (DISP_E_MEMBERNOTFOUND))
デバッグを停止して再起動すると、再び機能します (ページを離れるまでなど)。私のアプリに関する限り、javascript オブジェクトが消える原因は何なのかわかりません。アプリが COM オブジェクトへの参照を保持していることが原因であり、何らかの方法でそれを解放する必要があると推測しています (特に、MarshalByRefObject の基本型を持っているため、アプリ ドメイン間で渡されるので理にかなっています)。
なぜこうなった?javascriptオブジェクトにアクセスするより良い方法はありますか?それはプロパティと関数ですか?