本篇翻译于Klaus Loeffelmann的WinForms in a 64-Bit world – our strategy going forward
作为一个依靠创新和发展而蓬勃发展的社区的一部分,WinForms 开发人员经常突破界限来创造新的可能性。我们的开发人员还负责维护业务软件的关键任务线,这通常需要十年以上的时间。我们重视您的信任和您对使用我们的工具创建出色的软件解决方案的热情。 如您所知,Visual Studio 2022 从 32 位到 64 位的过渡引发了一些复杂问题。我们了解到这些变化在你们的开发过程中造成了一些麻烦,因此我们希望通过指出现有的解决方法以及我们针对这些问题的准备计划来澄清这些问题。
转向64 位平台不仅仅是简单的升级。 这是一项重大改进,可以在多个方面帮助 Visual Studio 更好地工作。最大的好处之一是能够使用更多内存。 在 32 位版本中,Visual Studio 可以使用的内存量受到限制,通常这会导致性能下降,甚至在处理大型项目时出现错误。 64 位版本消除了这些限制,使 Visual Studio 能够以更高的效率处理更大的项目。
但这不仅仅是获得更多内存的问题。 切换到 64 位还使 Visual Studio 能够更好地利用计算机的处理器,尤其是它的多核。 由于 64 位应用程序可以一次处理更多数据,因此它可以同时有效地使用更多内核,从而实现更快的操作。 这在构建项目时尤其明显。 如果您的项目很大,包含许多文件和代码,则 64 位上的构建操作会快得多。 这意味着减少等待构建完成的时间,从而帮助您更快地完成工作。 但这些并不是唯一的优势。 其他还有:
这些优点也适用于WinForms Designer。对于WinForms应用程序来说,反映复杂的业务案例是很常见的。 因此,这些应用程序通常包含数百个表单和用户控件,它们本身可能会变得非常庞大和复杂。 所有这些都会导致在编辑表单时需要立即生成大量代码。 因此,WinForms Designer无疑是64位过渡的最大受益者之一。Designer利用了在64位架构中访问更多内存的能力,大大提高了处理复杂设计任务的性能和能力。
综上所述,我们充分意识到,这一进步给绑定到 32 位体系结构并在 Windows Forms设计器上下文中使用以定位 .NET Framework 版本(最高版本 4.8.1)的某些组件带来了挑战。
从 32 位系统到 64 位系统的转变不仅仅是为了提高性能,还涉及基本的架构变化。 这些变化直接影响我们管理 .NET Framework 版本和 .NET Core 应用程序的方式。 例如,无法在 64 位进程中托管 32 位独占组件,也无法在 .NET Framework 进程中托管 .NET Core 类型。 然而,这不应该被视为一种可以避免的方法。 相反,它是技术自然进步和进化的必要组成部分。
您可以考虑多种途径,每种途径都有其自身的优点:
如果所有这些选项都不适合您的特殊情况,那么最后一个选项就是进程外 WinForms Designer :
为了支持 .NET Core 3.1 及更高版本,我们创建了 WinForms Designer 的进程外版本; 一个单独的进程,可以处理 Visual Studio 无法作为 .NET Framework 进程执行的任务。 这本质上要求我们创建一个全新的架构和可扩展性模型来同时处理两种类型的流程。升级到 .NET 确实面临着运行时和新的进程外设计器中的变化带来的挑战。 虽然我们确实在最重要的设计时功能方面保持一致,但在某些情况下,在新技术领域继续采用传统方法并没有真正的意义。
进程外设计器允许我们规避进程内设计的限制,即托管组件与托管设计器的目标框架(例如 Visual Studio)不兼容的问题。 这是通过启动一个新的设计器进程来完成的,然后该进程在与WinForms项目设置的目标框架版本中运行 ,从而允许更灵活地管理不同架构的组件。
此外,进程外设计器允许我们为更高版本的 .NET 提供支持,例如 .NET 8、9 及更高版本。 它通过允许组件利用这些较新版本的 .NET 中可能与 .NET Framework 不兼容的功能来实现此目的。
然而,这也意味着必须调整所有单独的组件及其控制设计器以跨不同的流程边界工作。 当您使用自己的 WinForms 控件库时,通过专用的控件设计器(提供自定义 CodeDOM 序列化、专用类型编辑器、自定义装饰器渲染或个性化 Designer 操作项)提供高度自定义设计时支持,您需要迁移 Designer 代码以使用 WinForms 设计器 SDK。 通过 .NET(核心、5+)中的库存控制,我们在这一领域取得了长足的进步。同样重要的是:我们大多数较大的第三方控制库合作伙伴也提供用于 .NET 版本 5、6 和 7 的产品 – .NET 8 的现代化版本正在制作中。
值得注意的是,当我们解决这些问题时,我们会根据使用情况对组件进行优先级排序。.NET Core 中一些不太常用的组件的设计器支持已被弃用,取而代之的是更常用的组件。
我们发现更多的人需要支持为 32 位 .NET Framework 设计 WinForms 应用程序,因为这些应用程序使用只能在 32 位进程中运行的组件。 因此,我们采用了 .NET 的 WinForms 进程外设计器的方法,并在此基础上引入了 32 位进程外 .NET Framework 设计器。
进程外设计器旨在生成一个单独的 32 位进程,该进程可以托管此类应用程序所需的组件。 通过这样做,它避免了 Visual Studio 的 64 位环境与 32 位组件之间的不兼容性。 尽管系统架构存在差异,但这种设计可以实现更平滑的集成和兼容性。
如果您尝试打开一个引用 32 位组件的 WinForms .NET Framework 项目,Visual Studio 将自动弹出一个对话框并询问您是否要使用 32 位 .NET Framework 流程外设计器打开项目。
就像 .NET 的对应工具一样,32 位 .NET Framework WinForms 应用程序的进程外设计器旨在提供相同的设计时体验,保留使用现有(甚至是遗留)32 位组件的能力。 尽管弥合架构差距的任务艰巨,但我们致力于确保平稳过渡并维护您所依赖的功能,同时还提供未来升级和增强的途径。
我们知道重要的旧项目可能依赖于 32 位 ActiveX 控件和其他当前与 Visual Studio 2022 不兼容的旧组件,特别是那些不面向 .NET(Core、5+)但面向 .NET Framework (最高版本 4.8.1)的项目. 在这些情况下,流程外设计器可以成为许多用例的解决方案。 但请注意,.NET (6+) WinForms 进程外设计器也应被视为首选和最佳实践方式 – 您将获得两全其美的好处:设计时和运行时的 32 位兼容性以及 最新、最现代、性能最强的 .NET 版本。
值得注意的是,更新的进程外 32 位 .NET Framework 设计器将无法实现与旧的进程内 .NET Framework Designer的完全同等,因为.NET Core 的进程外设计器提到的相同架构差异。这也意味着高度自定义的控件设计器与开箱即用的 .NET Framework 进程内设计器不兼容。如果您使用来自第三方的自定义控件库,您需要检查他们是否提供支持进程外 .NET Framework Designer 的版本。
进程外设计器是我们未来投入大部分精力的地方。这是我们今年的路线图规划:
对于 Visual Studio 2022 版本 17.9,我们发布了一项功能,它可以帮助您轻松选择是否应该为经典 Visual Studio 进程内设计器或进程外设计器打开 .NET Framework 项目。 与经典 WinForms 进程内设计器相比,差异如下:
向 64 位系统的过渡是一个重要的里程碑,需要采用新的方法、创新的解决方案和耐心。 如前所述,这不是一个快速修复错误的方法; 相反,它是我们作为一个社区共同管理过渡期间所需采取的方式。
我们致力于让您的旅程尽可能顺利。 您的反馈非常宝贵,它可以帮助我们确定需要重点努力的领域。 我们已经制定了路线图,并且正在取得进展,但完成的时间取决于您向我们提出的独特挑战。
总之,我们了解您所面临的复杂性,并且我们想向您保证在应对这些挑战方面正在取得进展。请记住,改变通常会带来一些不适,但它为成长和更好的结果铺平了道路。 我们想强调您在这一持续过渡中积极参与的重要性。随着我们不断努力改进和微调 64 位设计器以及我们的进程外设计器支持,您的反馈和错误报告非常宝贵。如果您在使用 WinForms 时遇到任何特定问题,我们强烈建议您直接在 GitHub 上的 WinForms 存储库中或通过 Visual Studio 的反馈功能报告这些问题。 详细、具体的问题报告,尤其是那些包含环境信息、重现步骤和具体错误消息的报告,可以极大地帮助我们更有效、更快速地识别和解决问题。 您在此过程中的参与对于成功开发更强大、更高效的 Visual Studio 至关重要,因为许多技术和遗留的32位组件已经有20年甚至更长的历史 。
从 32 位到 64 位的旅程是一个复杂的过程,并且充满挑战。 我们致力于让所有用户尽可能顺利地完成这一过渡,但我们知道这一过程中会遇到坎坷。
感谢您在我们推动更强大、更通用的 WinForms 生态系统过程中的支持和承诺,并一如既往……
…编码愉快!
The post 64 位世界中的 WinForms – 我们的未来战略 appeared first on .NET中文官方博客.