您好我正在使用GeckoFX(Firefox webcontrol的COM包装)。我正在创建如下的浏览器:
public ScrapperGecko() // constructor
{
ThreadStart ts = new ThreadStart(CreateBrowser);
CreateThread = new Thread(ts);
CreateThread.SetApartmentState(ApartmentState.STA);
CreateThread.Start();
}
public void CreateBrowser()
{
if (_Browser != null) return;
Gecko.Xpcom.Initialize(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "xulrunner"));
_Browser = new GeckoWebBrowser();
_Browser.DocumentCompleted += _Browser_DocumentCompleted;
frm.WindowState = FormWindowState.Maximized;
_Browser.Height = frm.ClientSize.Height;
_Browser.Width = frm.ClientSize.Width;
_Browser.Left = 0;
_Browser.Top = 0;
_Browser.Dock = DockStyle.Fill;
frm.ShowInTaskbar = true;
frm.Controls.Add(_Browser);
frm.Show();
}
然而,当我调用ScrapperGecko的方法从另一个线程访问Gecko时,如下所示:
public string GetCookie()
{
if (_Browser == null || _Browser.Document == null || _Browser.Document.DocumentElement == null) //Throw exception
return string.Empty;
return _Browser.Document.Cookie;
}
每当它命中_Browser.Document时,它都会抛出异常。
类型的例外 ' System.Runtime.InteropServices.InvalidComObjectException'发生在 Geckofx-Winforms.dll但未在用户代码中处理
附加信息:已与其分离的COM对象 不能使用基础RCW。
之后,我尝试修改方法变为这样(使用InvokeRequire),但之后它总是返回null,InvokeRequire方法是否正确,为什么返回值为null,它假设包含cookie?< / p>
public string GetCookie()
{
WaitForBrowser();
if (_Browser.InvokeRequired)
{
object obj = _Browser.Invoke(new Func<string>(GetCookie), null); // it works but the obj always **null** which it suppose to have value
return (string)obj;
}
if (_Browser == null || _Browser.Document == null || _Browser.Document.DocumentElement == null)
return string.Empty;
return _Browser.Document.Cookie;
}
COM仍在运行但尚未发布,因为我将COM对象设置为静态,并且永远不会自己调用Dispose,我可以确定COM仍在运行,所以它不应该是与另一个关于COM被发布和RCW错误的问题有关。