0

私は、(サードパーティが提供する) 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オブジェクトにアクセスするより良い方法はありますか?それはプロパティと関数ですか?

4

1 に答える 1

1

私の場合、必要なことを達成するためのより良い方法を見つけました。jsObjectにCOMオブジェクトとして直接アクセスする(そしてマーシャリングなどを心配する)代わりに、次のいずれかを使用します。

  • 戻り値なしで関数を呼び出すexecScriptまたは
  • 作業中のフレームに非表示のdiv要素を作成し、そのdivのinnerHTMLを、execScriptを使用して関心のあるjavascript変数/関数の戻り値と等しくなるように設定し、その値をDOMから個別に読み取ります。

変数/関数の戻り値を読み取るには、次のvb.net関数を使用します。

Private Function getJScriptVariable(ByVal JScript As String)
    Dim command As New StringBuilder()
    command.Append("var e = document.getElementById('Matt_JScriptReturn');")
    command.Append("if (e == null) {")
    command.Append("var e = document.createElement('div');")
    command.Append("e.id = 'Matt_JScriptReturn';")
    command.Append("e.type = 'hidden';")
    command.Append("document.body.appendChild(e);")
    command.Append("}")
    command.Append("e.innerHTML = ")
    command.Append(JScript)
    command.Append(";")

    'fMaster is the frame containing the javascript's mshtml.IHTMLWindow2
    fMaster.execScript(command.ToString(), "JScript")

    'N.B. fMaster_Document is the fMaster's mshtml.HTMLDocument
    Return fMaster_Document.getElementById("Matt_JScriptReturn").innerHTML

    'Optionally execScript to remove element from DOM at this point
End Function

次に、その関数を次のように使用します(元の質問の例を尊重します)。

Dim value as String = getJScriptVariable("jsObject.FunctionThatReturnsAString()")

値を返さずにJavaScriptコードを実行するには、次のように実行します。

fMaster.execScript("jsObject.FunctionTHatDoesSomethingInWebApp('Param1', 'Param2')")

ページを離れて戻った後、javasciptオブジェクトにアクセスできないという問題が以前に発生した理由を見つけるのはまだ興味深いですが、これで問題が解決するので、今は満足しています。これがいつか他の誰かに役立つことを願っています。

于 2012-08-16T09:44:27.897 に答える