HOW TO:使用 IEHost 日志调试 Internet Explorer 中承载的 .NET 对象

本文已归档。它按“原样”提供,并且不再更新。
重要说明: 本文包含有关修改注册表的信息。修改注册表之前,请务必备份注册表,并且一定要知道在发生问题时如何还原注册表。有关如何备份、还原和编辑注册表的信息,请单击下面的文章编号,查看 Microsoft 知识库文章:
256986 Description of the Microsoft Windows Registry(Microsoft Windows 注册表说明)

本任务的内容

概要
本文说明如何为 IEHost.dll(即在 Internet Explorer 内部运行的托管公共语言运行库 (CLR) 宿主)激活扩展错误日志。

Microsoft .NET Framework SDK 文档说明如何使用 Fuslogvw.exe 调试在 Internet Explorer 中承载 .NET 模块时可能发生的问题。该实用程序的名称出自“Fusion”,它是 Microsoft 最新的零影响程序安装技术。因此,Fuslogvw.exe 只报告在下载程序集或其依赖项时出现的错误。

back to the top

关于 IEHost.dll

Internet Explorer 通过两个组件来支持 .NET 模块。第一个组件是在 Mscoree.dll 中实现的 MIME 筛选器,它在 Internet Explorer 调用 IMonikerBindToObject 方法时,监视所有传入的具有application/octet-stream MIME 类型的数据流。该筛选器在数据流中检查可移植可执行文件 (PE) 头中的信息,以确定它是否是托管模块。如果不是,该筛选器将直接返回,让 Internet Explorer 按常规方式处理该数据流。

如果数据流是 .NET 模块,该筛选器将加载 IEHost 托管程序集并调用其工厂对象,以创建所请求的对象的实例。该工厂对象则调用 IEManager(这是为 Internet Explorer 配置应用程序域 (AppDomains) 的安全管理器),并使用这个程序集的证据(也就是它的 URL 和区域成员资格)来确定程序集的加载权限。

Fusion 日志中不会记录程序集加载、安全权限或对象初始化时发生的错误。与 ActiveX 控件一样,初始化失败的 .NET 对象通常不会报错,Internet Explorer 只会在放置该对象的地方显示一个带有小“X”的方框。要查看这些错误,您必须激活 IEHost 调试日志。

有关 MIME 筛选器的其他信息,请单击下面的文章编号,查看 Microsoft 知识库文章:
260840 示例:MIMEfilt Demonstrates MIME Filter for Internet Explorer(MIMEfilt 演示 Internet Explorer 的 MIME 筛选器)
back to the top

激活 IEHost 调试日志文件

警告: “注册表编辑器”使用不当可能会导致严重问题,这些问题可能要求重新安装操作系统。Microsoft 不保证能够解决因为“注册表编辑器”使用不当而产生的问题。使用“注册表编辑器”的风险由您自己承担。
  1. 依次单击开始运行,键入 regedit,然后单击确定
  2. 找到并单击下面的注册表项:
    HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework
  3. 在该项中添加一个名为DebugIEHost 的 DWORD 值,然后为其指定一个任意非零值。
  4. 添加一个名为IEHostLogFile 的字符串值。为该值指定用于记录调试日志的文件的完整路径(包括文件名)(例如,C:\Temp\IEDebug.log)。
back to the top

调试日志文件中包含的信息

IEHost 创建的日志文件包含由以下两个 .NET 类写入的项目:Microsoft.IE.ManagerMicrosoft.IE.SecureFactory。 例如:
Creating security managerMicrosoft.IE.Manager: Microsoft.IE.Manager: unique id lgth = 28Microsoft.IE.SecureFactory: Create SecureFactory() with security informationMicrosoft.IE.Manager: Created secure factoryMicrosoft.IE.SecureFactory: Creating instance of the object in the correct domainMicrosoft.IE.SecureFactory: pUrl = http://servername/DebugIEHost/DebugIEHost/test.htmMicrosoft.IE.SecureFactory: id = 86474707A316B616E65610000000Microsoft.IE.SecureFactory: link = Microsoft.IE.SecureFactory: licenses = Microsoft.IE.Manager: Url = http://servername/DebugIEHost/DebugIEHost/test.htmMicrosoft.IE.Manager: UrlGetPartW returned 0Microsoft.IE.Manager: CodeBase = http://servernameMicrosoft.IE.Manager: Application = DebugIEHost/DebugIEHost					
以上信息标识了用于安全目的的 URL、正在启动的应用程序的名称、用于下载依赖项的代码基和适用于该对象的许可证(以及其他有用的信息)。

最有用的信息是堆栈跟踪;如果在对象创建期间发生错误,日志文件中将记录这些信息。例如,假定您试图在类构造函数中写入文件夹:
public DebugIEHost() {    // This call is required by the Windows.Forms Form Designer.    InitializeComponent();    // TODO: Add any initialization after the InitForm call    FileStream fs = File.Open(@"C:\temp.tmp",System.IO.FileMode.CreateNew);    StreamWriter sw = new System.IO.StreamWriter(fs);    sw.WriteLine("Hello, world");}				
该操作不会成功。因为该对象尚未在 Internet Explorer 中完全建立起来,因此它会自动失败。不过,一份详细的堆栈跟踪会写入日志文件。您通常会看到两种堆栈跟踪:内部异常(由控件引发)和服务器异常(运行库接到控件抛出的异常后重新抛出的异常)。例如:
Microsoft.IE.SecureFactory: System.Reflection.TargetInvocationException:Exception has been thrown by the target of an invocation.---->System.Security.SecurityException: Request for the permission of type System.Security.Permissions.FileIOPermission, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 failed.   at System.Security.CodeAccessSecurityEngine.CheckHelper(PermissionSet grantedSet, PermissionSet deniedSet, CodeAccessPermission demand, PermissionToken permToken)   ...					
对于安全异常,您还会收到如下有关安全权限请求失败的详细信息:
The state of the failed permission was: <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"             version="1"             Read="C:\temp.tmp"             Write="C:\temp.tmp"/>					
back to the top
参考
有关使用 .NET Framework SDK 进行调试的更多信息,请访问以下 MSDN Web 站点:back to the top
属性

文章 ID:313892 - 上次审阅时间:12/07/2015 08:17:37 - 修订版本: 1.5

Microsoft .NET Framework 1.1, Microsoft Internet Explorer 5.5, Microsoft Internet Explorer (Programming) 6.0

  • kbnosurvey kbarchive kbhowtomaster kbmisctools kbdebug kbctrl KB313892
反馈