排查 32 位问题

升级到 Visual Studio 2022 后,您可能会遇到应用程序在设计时体验停止工作的情况。 这可能与引用 32 位组件相关。 Visual Studio 2022 是一个 64 位进程,无论基础技术(如 .NET Framework、.NET 或 COM\ActiveX)如何,都无法加载 32 位组件。 在尝试升级 Visual Studio 之前,你可能没有意识到你对 32 位组件的引用。 编译为 64 位或目标为 AnyCPU 的引用将继续正常工作。 如果您引用的组件被编译为 AnyCPU,但碰巧引用了 32 位的内容,您也会遇到相同的问题。

怎么了

Windows 窗体代码以两种模式运行:设计时和运行时。 在运行时,你运行的模式是编译时选择的:32 位 或者 64 位;.NET Framework 或者 .NET。 在设计时,代码在 Visual Studio 中运行,这是一个 64 位 .NET Framework 进程。 如果项目代码与该环境不匹配,则无法在设计器中运行。 例如,如果项目面向 32 位 .NET Framework 或 64 位 .NET,则它与 Visual Studio 的 64 位 .NET Framework 进程不匹配。 问题在于:Visual Studio 中的 Windows 窗体设计器无法直接实例化 32 位组件或 .NET 组件,它只能实例化 64 位 .NET Framework 组件。 为了解决这些集成问题,Windows 窗体团队为 Visual Studio 创建了 进程外设计器 ,该设计器类似于 Windows 窗体设计器的翻译层。 进程外设计器代表代码与 Visual Studio 64 位 .NET Framework 设计器通信,以便可以将设计器与 .NET 项目配合使用。

早期版本的 Visual Studio 面向 32 位,并且你的项目可能编译为 AnyCPU,在设计模式下选择 32 位以匹配 Visual Studio。 32 位特定引用可以正常工作,但如果使用 64 位特定引用,可能会导致设计器出现问题。 使用 Visual Studio 2022 时,问题已逆转。 Visual Studio 2022 仅在 64 位中可用。 编译为 AnyCPU 的组件和库可以在 32 位和 64 位系统中运行,并且在 Visual Studio 2022 64 位中运行没有问题。 但是,升级到 Visual Studio 2022 后,如果项目依赖于 32 位特定组件,则项目在设计时可能无法运行。 即使在编译 AnyCPU引用的组件时也是如此,但碰巧直接引用 32 位组件或 32 位 COM\ActiveX 库。

总之,Visual Studio 2022 中的 Windows 窗体设计器无法使用 32 位组件,这是一个 64 位应用。 创建 外部进程设计器 是为了在设计时为 .NET 应用的 Windows 窗体提供帮助,适用于 32 位和 64 位系统。 此设计器现在有助于加载 32 位和 64 位 .NET Framework 组件。

你能做什么?

你应该考虑一些设计更改,这有助于你的项目。

  • 从 .NET Framework 升级到 .NET 8+。

    .NET 使用进程外设计器,这有助于解决 32 位设计器问题。

  • 使用 .NET Framework,将应用设置为目标 AnyCPU

    如果面向 AnyCPU 并启用 Prefer 32-bit,则应用在 Visual Studio 设计时以 64 位运行,但在运行时编译为 32 位。

  • 请将 AnyCPU 组件重新编译为 32 位或 64 位。

    如果有权访问 32 位组件的源代码,请尝试为 AnyCPU 或 64 位编译它并引用该新版本。

  • 查找 64 位备用组件。

    如果使用的是其他人拥有的组件,请检查它们是否提供 64 位版本,并引用该版本。

  • 试用进程外设计器。

    最后一个选项是为 .NET Framework 启用进程外设计器。

进程外设计器

如果项目面向 .NET,则已使用进程外设计器。 但是,如果仍在使用 .NET Framework,则需要启用进程外设计器。

警告

由于相同的体系结构差异,更新后的进程外 32 位 .NET Framework 设计器无法与旧的进程内 .NET Framework 设计器完全一致。 高度自定义的控件设计器不兼容。 如果从第三方使用自定义控件库,请检查它们是否提供支持进程外 .NET Framework 设计器的版本。

脱离进程设计器处理 Visual Studio 2022 中的一些 32 位问题,但存在一定限制。

  • .NET Framework 受益于改进的类型解析。
  • .NET Framework 和 .NET 都支持 ActiveX 和 COM 引用。
  • Visual Studio 中的进程内设计器检测到 32 位程序集加载失败,并可以建议启用进程外设计器。

使用进程外设计器

支持 32 位引用需要 Visual Studio 17.9 或更高版本。 通过将以下 <PropertyGroup> 设置添加到项目文件来启用它:

<PropertyGroup>
    <UseWinFormsOutOfProcDesigner>True</UseWinFormsOutOfProcDesigner>
</PropertyGroup>

修改项目文件后,重新加载项目。

32 位问题检测

目前,当 Visual Studio 检测到 32 位引用无法加载时,它会提示启用 Windows 窗体进程外设计器。 如果同意启用它,则会为你更新项目,然后重新加载。

Visual Studio 中窗口的图像,提示用户启用进程外设计器。

此检测功能在 Visual Studio 菜单中的 “工具>选项>预览功能”下进行控制。

另请参阅