自定义 WebBrowser (winforms) 代码的致命错误

Fatal error on Custom WebBrowser (winforms) code

CustomWebBrowser (winforms) 代码出现致命异常。

运行时遇到致命错误。错误地址位于线程 0xf94 上的 0x6c9a60c6。错误代码是 0xc0000005。此错误可能是 CLR 中的错​​误,或者是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户编组错误,这可能会损坏堆栈。

这在安装了 .Net Framework 4.5 的机器上运行良好,但在安装了 .Net Framework 4.0[= 的机器上运行不正常29=]

// constructor
    public AutoCompleteWebBrowserSite(WebBrowser host) :
        base(host)
    {

        // get the CCW object for this
        _unkOuter = Marshal.GetIUnknownForObject(this);
        Marshal.AddRef(_unkOuter);
        try
        {
            // aggregate the CCW object with the helper Inner object
            _inner = new AutoCompleteHelper(this);
            _unkInnerAggregated = Marshal.CreateAggregatedObject(_unkOuter, _inner);

            // obtain private WebBrowserSite COM interfaces
            try
            {
                _baseIDocHostUiHandler = (WebBrowserNativeMethods.IDocHostUIHandler)  Marshal.GetTypedObjectForIUnknown(_unkInnerAggregated,typeof (WebBrowserNativeMethods.IDocHostUIHandler));
            }
            catch(Exception)
        }
        finally
        {
            Marshal.Release(_unkOuter);
        }
    }

_baseIDocHostUiHandler = (WebBrowserNativeMethods.IDocHostUIHandler)Marshal.GetTypedObjectForIUnknown(_unkInnerAggregated,typeof (WebBrowserNativeMethods.IDocHostUIHandler));

抛出了异常

还尝试 disabling concurrent garbage collection 在 app.config 文件中禁用 gcConcurrent

任何帮助将不胜感激。

基本上需要从构造函数中删除所有代码(主要是_baseIDocHostUiHandler)

然后在 WebBrowserSite 实现中,尝试 return 每个方法的默认实现值。

   private const int DefaultImpVal = unchecked((int)0x80004001)

  #region IDocHostUIHandler
            int WebBrowserNativeMethods.IDocHostUIHandler.ShowContextMenu(int dwId, ref WebBrowserNativeMethods.Point pt, IntPtr pcmdtReserved, IntPtr pdispReserved)
            {
                return DefaultImpVal ;
            }

int WebBrowserNativeMethods.IDocHostUIHandler.ShowUI(int dwId, IntPtr activeObject, IntPtr commandTarget, IntPtr frame, IntPtr doc)
            {
                return DefaultImpVal;
            }

其他方法也类似。