我想用AxWebBrowser上的控制檯應用程序,但它給我以下異常:如何使用AxWebBrowser在控制檯應用程序
類型的異常「System.Windows.Forms.AxHost + InvalidActiveXStateException」被拋出。
有誰請幫助我在此以任何示例代碼爲控制檯應用程序用c#AxWebBrowser沒有任何exeption ...
我想用AxWebBrowser上的控制檯應用程序,但它給我以下異常:如何使用AxWebBrowser在控制檯應用程序
類型的異常「System.Windows.Forms.AxHost + InvalidActiveXStateException」被拋出。
有誰請幫助我在此以任何示例代碼爲控制檯應用程序用c#AxWebBrowser沒有任何exeption ...
的STAThread
屬性添加到您的Main
方法。
但是,您不應該使用「原始」ActiveX控件。
相反,請添加對System.Windows.Forms.dll的引用並使用WebBrowser
類。 (是的,你可以在控制檯應用程序中做到這一點)
另外,自動化IE並不理想。您應該考慮使用WebCLient
類。
您可以寫一個示例代碼來添加STAThread屬性... – 2010-01-24 14:16:04
只需在您的Main()方法上添加'[STAThread]'。 – 2010-01-24 14:23:56
謝謝,但實際上我有一個名爲「瀏覽」的類,控制檯應用程序使用url輸入參數調用其「StartBrowse」方法,並且在此函數中,我應該瀏覽該URL並執行一些處理並返回一些結果,以便我應該在哪裏放置[STAThread]屬性?我把它放在「StartBrowse」方法之前,但它在運行時給了我同樣的例外! – 2010-01-24 15:09:24
是的,您的Main()方法需要[STAThread]屬性,以便正確初始化COM以使主線程成爲單線程公寓。這並不是全部,但你也需要抽取一個消息循環。這是STA的要求。沒有人,WebBrowser無法更新其狀態或運行其事件處理程序,例如,您將永遠無法獲得DocumentCompleted事件。您可以通過Application.Run()獲得消息循環。
您的控制檯應用程序現在無法與Windows窗體應用程序區分開來。通過使用Windows Forms應用程序項目模板,然後使用Project + Properties,Output type = Console Application來啓動一個新項目,實際上更容易。編輯Program.cs中的Application.Run()調用,以便它不創建表單。它不會使處理Application.Run()更容易,可以考慮一個Timer來運行代碼。
我的班級如下但是在運行時它給了我System.Windows.Forms.AxHost + InvalidActiveXStateException:
public class Browse
{
private static AxWebBrowser wBrowser;
public static Result StartBrowse(string url)
{
var validUri = (url.Contains("http://") ? url : "http://" + url);
wBrowser = new AxWebBrowser();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(AxWebBrowser));
((ISupportInitialize) (wBrowser)).BeginInit();
wBrowser.OcxState = ((AxHost.State)(resources.GetObject("wBrowser.OcxState")));
wBrowser.NewWindow2 += wBrowser_NewWindow2;
wBrowser.NewWindow3 += wBrowser_NewWindow3;
wBrowser.DocumentComplete += wBrowser_DocumentComplete;
wBrowser.DownloadComplete += wBrowser_DownloadComplete;
if (string.IsNullOrEmpty(html) || validUri != url)
{
object empty = System.Reflection.Missing.Value;
wBrowser.Silent = true;
wBrowser.Navigate(validUri, ref empty, ref empty, ref empty, ref empty);
}
return null;
}
static void wBrowser_DownloadComplete(object sender, EventArgs e)
{
doAlgorithm();
}
static void wBrowser_DocumentComplete(object sender, DWebBrowserEvents2_DocumentCompleteEvent e)
{
doAlgorithm();
}
static void wBrowser_NewWindow3(object sender, DWebBrowserEvents2_NewWindow3Event e)
{
e.cancel = true;
}
static void wBrowser_NewWindow2(object sender, DWebBrowserEvents2_NewWindow2Event e)
{
e.cancel = true;
}
}
首先,在控制託管必須是單線程的線程公寓,你可以把STAThread
在你的主要方法,或創建一個獨立的線程是這樣的:
var thread = new Thread(() =>
{
//My code
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join(); //Wait for thread termination
其次,你必須啓動一個消息循環:
while (true) //Put some exit condition
System.Windows.Forms.Application.DoEvents();
第三個控件必須以可見的形式託管。該表格必須是可見的只有一次,所以要避免「閃爍」,你可以這樣寫代碼:
var browser = new AxWebBrowser();
var hostForm = new Form();
//Set form 0 size, without any control box/title/icon
hostForm.Width = 0;
hostForm.Height = 0;
hostForm.ShowInTaskbar = false;
hostForm.ControlBox = false;
hostForm.ShowIcon = false;
hostForm.MinimizeBox = false;
hostForm.MaximizeBox = false;
//Add browser control
hostForm.Controls.Add(browser);
//Show and immediately hide
hostForm.Show();
hostForm.Hide();
最後,你可能要禁用「咔嚓」聲(How to disable click sound in WebBrowser Control)
最後的代碼:
class Program
{
[STAThread]
static void Main(string[] args)
{
URLSecurityZoneAPI.InternetSetFeatureEnabled(URLSecurityZoneAPI.InternetFeaturelist.DISABLE_NAVIGATION_SOUNDS, URLSecurityZoneAPI.SetFeatureOn.PROCESS, true);
var browser = new AxWebBrowser();
var hostForm = new Form();
hostForm.Width = 0;
hostForm.Height = 0;
hostForm.ShowInTaskbar = false;
hostForm.ControlBox = false;
hostForm.ShowIcon = false;
hostForm.MinimizeBox = false;
hostForm.MaximizeBox = false;
hostForm.Controls.Add(browser);
hostForm.Show();
hostForm.Hide();
browser.DocumentComplete += delegate(object sender, DWebBrowserEvents2_DocumentCompleteEvent e)
{
var doc = (IHTMLDocument3)browser.Document;
Console.WriteLine(doc.documentElement.innerHTML);
};
browser.Navigate("www.google.com");
while (true)
System.Windows.Forms.Application.DoEvents();
}
}
爲x86而不是x64構建項目。 – 2010-02-05 12:02:51