17 Stimmen

Verwendung von WebBrowser in einer Konsolenanwendung

Ich möchte es verwenden, um einige JS-Skripte auf der Webseite aufzurufen. Ich habe dies:

    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();
    }

Frage 1: Ich erhalte eine "object reference not set"-Ausnahme, wenn ich versuche, eine doc.ToString() . Warum?

Frage 2: Wie bekomme ich einige Daten aus dem HTML-Dokument in das Hauptprogramm? WebBrowser erfordert einen separaten Thread, der eine statische Methode benötigt, die keinen Wert zurückgeben kann. Wie gebe ich zurück, sagen wir, doc zum Main() damit ich etwas damit machen kann?

15voto

Hans Passant Punkte 894572

Richtige Idee, falsche Ausführung. Die Funktion WebBrowser.Navigate() weist den Webbrowser lediglich an Start die Navigation zu der von Ihnen gewünschten Webseite. Das braucht Zeit, in der Regel Hunderte von Millisekunden. Der Internet Explorer startet intern Threads, um die Aufgabe zu erledigen. Er teilt Ihnen mit, wann er fertig ist, indem er das Ereignis DocumentCompleted auslöst. Darauf warten Sie nicht, also ist das der erste Absturz.

Das nächste Problem ist, dass das Ereignis DocumentCompleted in Ihrem Code nicht ausgelöst wird. Sie müssen den STA-Vertrag einhalten, d. h. Sie müssen eine Nachrichtenschleife pumpen. Das ist die allmächtige Art und Weise, wie ein Hintergrund-Thread, z. B. derjenige, den der IE zum Abrufen einer Webseite verwendet, Folgendes mitteilt Ihr Thread, dass die Arbeit erledigt ist.

Der benötigte Boilerplate-Code ist verfügbar in diese Antwort .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X