注释
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
公共语言运行时 (CLR) 激活系统确定将用于运行托管应用程序代码的 CLR 版本。 在某些情况下,激活系统可能无法找到要加载的 CLR 版本。 当应用程序需要在给定计算机上安装无效或未安装的 CLR 版本时,通常会发生这种情况。 如果未找到请求的版本,CLR 激活系统将从调用的函数或接口返回 HRESULT 错误代码,并可能会向用户显示一条错误消息,该用户正在运行该应用程序。 本文提供了 HRESULT 代码列表,并介绍了如何防止显示错误消息。
CLR 提供日志记录基础结构来帮助调试 CLR 激活问题,如 如何:调试 CLR 激活问题中所述。 不应将此基础结构与 程序集绑定日志混淆,这些日志完全不同。
CLR 激活 HRESULT 代码
CLR 激活 API 返回 HRESULT 代码,以向主机报告激活作的结果。 在进行其他操作之前,CLR 主机应始终参考这些返回值。
CLR_E_SHIM_RUNTIMELOAD
CLR_E_SHIM_RUNTIMEEXPORT
CLR_E_SHIM_INSTALLROOT
CLR_E_SHIM_INSTALLCOMP
CLR_E_SHIM_LEGACYRUNTIMEALREADYBOUND
CLR_E_SHIM_SHUTDOWNINPROGRESS
初始化错误的 UI
如果 CLR 激活系统无法加载应用程序所需的运行时的正确版本,则会向用户显示一条错误消息,告知其计算机未正确配置为运行应用程序,并为他们提供补救情况的机会。 在这种情况下,通常会显示以下错误消息。 用户可以选择 “是 ”转到Microsoft网站,可在其中下载应用程序的正确 .NET Framework 版本。
解决初始化错误
作为开发人员,可以使用各种选项来控制 .NET Framework 初始化错误消息。 例如,可以使用 API 标志来阻止显示消息,如下一部分所述。 但是,仍必须解决阻止应用程序加载请求的运行时的问题。 否则,应用程序可能根本不运行,或者某些功能可能不可用。
若要解决基础问题并提供最佳用户体验(减少错误消息),建议执行以下作:
对于 .NET Framework 3.5(及更早版本)应用程序:将应用程序配置为支持 .NET Framework 4 或更高版本(请参阅 说明)。
对于 .NET Framework 4 应用程序:在应用程序设置过程中安装 .NET Framework 4 可再发行组件包。 请参阅 面向开发人员的部署指南。
控制错误消息
显示错误消息以告知找不到请求的 .NET Framework 版本,可被视为有用的服务或对用户的轻微烦恼。 无论哪种情况,都可以通过将标志传递给激活 API 来控制此 UI。
ICLRMetaHostPolicy::GetRequestedRuntime 方法接受METAHOST_POLICY_FLAGS枚举成员作为输入。 如果找不到请求的 CLR 版本,可以包含METAHOST_POLICY_SHOW_ERROR_DIALOG标志来请求错误消息。 默认情况下,不会显示错误消息。 ( ICLRMetaHost::GetRuntime 方法不接受此标志,并且不提供任何其他显示错误消息的方法。
Windows 提供 SetErrorMode 函数,可用于声明您是否希望进程内运行的代码引发的错误消息显示。 可以指定 SEM_FAILCRITICALERRORS 标志来阻止显示错误消息。
但是,在某些情况下,需要替代由应用程序进程设置的 SEM_FAILCRITICALERRORS 设置。 例如,如果使用本机 COM 组件托管 CLR 且托管位置位于设置 SEM_FAILCRITICALERRORS 的进程,则建议替代该标志,具体取决于在该特定应用程序进程内显示的错误消息的影响。 在这种情况下,可以使用以下一种标志替代 SEM_FAILCRITICALERRORS:
将METAHOST_POLICY_IGNORE_ERROR_MODE与 ICLRMetaHostPolicy::GetRequestedRuntime 方法配合使用。
将RUNTIME_INFO_IGNORE_ERROR_MODE与 GetRequestedRuntimeInfo 函数配合使用。
用于提供 CLR 的主机的 UI 策略
CLR 包括一组适用于各种方案的主机,这些主机在加载所需的运行时版本时遇到问题时都会显示一条错误消息。 下表提供了主机及其错误消息策略的列表。
CLR 主机 | DESCRIPTION | 错误消息策略 | 是否可以禁用错误消息? |
---|---|---|---|
托管 EXE 主机 | 启动托管 EXE。 | 遇到缺少 .NET Framework 版本的情况时将显示 | 否 |
托管 COM 主机 | 将托管 COM 组件加载到进程。 | 遇到缺少 .NET Framework 版本的情况时将显示 | 是,通过设置 SEM_FAILCRITICALERRORS 标志 |
ClickOnce 主机 | 启动 ClickOnce 应用程序。 | 在缺少 .NET Framework 版本的情况下,从 .NET Framework 4.5 开始显示 | 否 |
XBAP 主机 | 启动 WPF XBAP 应用程序。 | 在缺少 .NET Framework 版本的情况下,从 .NET Framework 4.5 开始显示 | 否 |
Windows 8 行为和用户界面
CLR 激活系统在 Windows 8 上提供的行为和界面与 Windows 操作系统的其他版本相同,除非遇到加载 CLR 2.0 的问题。 Windows 8 包括使用 CLR 4.5 的 .NET Framework 4.5。 但是,Windows 8 不包括 .NET Framework 2.0、3.0 或 3.5,它们都使用 CLR 2.0。 因此,依赖于 CLR 2.0 的应用程序默认情况下不会在 Windows 8 上运行。 相反,他们会显示以下对话框,使用户能够安装 .NET Framework 3.5。 用户还可以在控制面板中启用 .NET Framework 3.5。 这两个选项都在 Windows 11、Windows 10、Windows 8.1 和 Windows 8 上安装 .NET Framework 3.5 一文中进行了讨论。
注释
.NET Framework 4.5 替换用户计算机上的 .NET Framework 4 (CLR 4)。 因此,.NET Framework 4 应用程序在 Windows 8 上无缝运行,而不显示此对话框。
安装 .NET Framework 3.5 后,用户可以在其 Windows 8 计算机上运行依赖于 .NET Framework 2.0、3.0 或 3.5 的应用程序。 它们还可以运行 .NET Framework 1.0 和 1.1 应用程序,前提是这些应用程序未显式配置为仅在 .NET Framework 1.0 或 1.1 上运行。 请参阅 从 .NET Framework 1.1 迁移。
从 .NET Framework 4.5 开始,CLR 激活日志记录已得到改进,以包含记录何时以及为何显示初始化错误消息的日志条目。 有关详细信息,请参阅如何:调试 CLR 激活问题。