在COM仍在运行时访问在另一个线程中创建的COM包装器对象的属性

时间:2015-04-18 14:13:00

标签: c# com geckofx

您好我正在使用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错误的问题有关。

0 个答案:

没有答案