web-dev-qa-db-ja.com

コンソールアプリケーションでのWebBrowserの使用

これを使用して、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には別のスレッドが必要です。これには、値を返すことができない静的メソッドが必要です。たとえば、docMain()に戻して、それを使って何かを実行するにはどうすればよいですか?

14
Hui

正しい考え、間違った実行。 WebBrowser.Navigate()は、要求したWebページに移動するようにstartするようにWebブラウザーに指示するだけです。これには時間がかかり、通常は数百ミリ秒かかります。 Internet Explorerは、ジョブを実行するために内部的にスレッドを開始します。 DocumentCompletedイベントを発生させることにより、いつ完了したかを通知します。あなたはそれを待たないので、それは最初にクラッシュシティです。

次の問題は、DocumentCompletedイベントがコードで発生しないことです。 STAコントラクトを尊重する必要があり、メッセージループをポンピングする必要があります。これは、IEがWebページを取得するために使用するような、バックグラウンドスレッドがyourジョブが実行されたスレッド。

必要な定型コードは この回答 で入手できます。

12
Hans Passant