自定义 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;
}
其他方法也类似。
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;
}
其他方法也类似。