Windows .net 4.0 框架上的 Forms WebBrowser 控件错误

Windows Forms WebBrowser control error on .net 4.0 framework

我的 C# 代码抛出了一个致命错误,我在其中自定义了表单 Web 浏览器以支持浏览器自动完成功能。 当我们尝试获取 WebBrowserSite COM 接口时,仅在 .net 4.0 框架上抛出异常。

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

代码:

        // 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);
            }
        }

这个异常有什么原因和解决办法吗?在使用框架 4.5 的机器上不会发生这种情况。

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

然后在 WebBrowserSite 实现中,尝试为每个方法返回默认实现值。

   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;
            }

其他方法也类似。