Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用COM对象实现浏览器自动化.net_C#_Vb.net_Interface_Com - Fatal编程技术网

C# 使用COM对象实现浏览器自动化.net

C# 使用COM对象实现浏览器自动化.net,c#,vb.net,interface,com,C#,Vb.net,Interface,Com,阅读COM界面上的小维基。浏览论坛,尽我所能,在.NET开发浏览器自动化控制台应用程序时,许多人似乎都不赞成使用这些应用程序 什么是我平常的选择 Dim ie As InternetExplorer ie = New InternetExplorer ie.Visible = True ie.Navigate(website) 我不确定是否允许提出最佳实践类型的问题,但我很想知道这个问题的答案。主要是替代方案,当然还有一个简短的原因?谢

阅读COM界面上的小维基。浏览论坛,尽我所能,在.NET开发浏览器自动化控制台应用程序时,许多人似乎都不赞成使用这些应用程序

什么是我平常的选择

    Dim ie As InternetExplorer

        ie = New InternetExplorer
        ie.Visible = True
        ie.Navigate(website)

我不确定是否允许提出最佳实践类型的问题,但我很想知道这个问题的答案。主要是替代方案,当然还有一个简短的原因?谢谢你们

实际上,您可以在多线程+控制台/winforms应用程序中使用Webbrowser控件

根据这一回答:


感谢您回答这个问题,我们将继续选择它。但你们能不能回敬一下,解释一下为什么这样会更好?我仍然不明白为什么一个会比另一个好?我一直觉得web浏览器的控制就是将浏览器嵌入到应用程序中,以便用户更好地使用。再次感谢您的回复,真的很棒!嵌入到表单中或在后台线程中使用它,需要注意的重要一点是,您不应该阻止紧循环、thread.Sleep等创建WebBrowser的线程。如果你只对网页抓取感兴趣,你也可以使用
var html = RunWBControl("http://google.com").Result;
static public Task<string> RunWBControl(string url)
{
    var tcs = new TaskCompletionSource<string>();
    var th = new Thread(() =>
    {
        WebBrowserDocumentCompletedEventHandler completed = null;

        using (WebBrowser wb = new WebBrowser())
        {
            completed = (sndr, e) =>
            {
                tcs.TrySetResult(wb.DocumentText);
                wb.DocumentCompleted -= completed;
                Application.ExitThread();
            };

            wb.DocumentCompleted += completed;
            wb.Navigate(url);
            Application.Run();
        }
    });

    th.SetApartmentState(ApartmentState.STA);
    th.Start();

    return tcs.Task;
}