これを使用して、WebページでいくつかのJSスクリプトを呼び出したいと思います。私はこれを持っています:
_ static void Stuff()
{
WebBrowser browser = new WebBrowser();
browser.Navigate("http://www.iana.org/domains/example/");
HtmlDocument doc = browser.Document;
//doc.InvokeScript("someScript");
Console.WriteLine(doc.ToString());
}
static void Main(string[] args)
{
Console.WriteLine("hi");
var t = new Thread(Stuff);
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
_
質問1:doc.ToString()
を取得しようとすると、「オブジェクト参照が設定されていません」という例外が発生します。どうして?
質問2:HTMLドキュメントからメインプログラムにデータを取得するにはどうすればよいですか? WebBrowser
には別のスレッドが必要です。これには、値を返すことができない静的メソッドが必要です。たとえば、doc
をMain()
に戻して、それを使って何かを実行するにはどうすればよいですか?
正しい考え、間違った実行。 WebBrowser.Navigate()は、要求したWebページに移動するようにstartするようにWebブラウザーに指示するだけです。これには時間がかかり、通常は数百ミリ秒かかります。 Internet Explorerは、ジョブを実行するために内部的にスレッドを開始します。 DocumentCompletedイベントを発生させることにより、いつ完了したかを通知します。あなたはそれを待たないので、それは最初にクラッシュシティです。
次の問題は、DocumentCompletedイベントがコードで発生しないことです。 STAコントラクトを尊重する必要があり、メッセージループをポンピングする必要があります。これは、IEがWebページを取得するために使用するような、バックグラウンドスレッドがyourジョブが実行されたスレッド。
必要な定型コードは この回答 で入手できます。