在控制台应用程序中使用WebBrowser

我想用它来调用网页上的一些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()时,我收到“对象引用未设置”exception。 为什么?

问题2:如何从HTML文档中将一些数据导入主程序? WebBrowser需要一个单独的线程,这需要一个不能返回任何值的静态方法。 如何将doc返回到Main()以便我可以用它做些什么?

正确的想法,错误的执行。 WebBrowser.Navigate()仅告知Web浏览器开始导航到您要求的网页。 这需要时间,通常为数百毫秒。 Internet Explorer在内部启动线程以完成工作。 它通过引发DocumentCompleted事件告诉您何时完成。 你不要等待,所以先崩溃城市。

下一个问题是您的代码中不会引发DocumentCompleted事件。 你必须尊重STA合同,它要求你抽一个消息循环。 这是一个非常强大的方式,后台线程,如IE用于检索网页线程,告诉您的线程作业已完成。

您需要的样板代码可在此答案中找到 。