【译】32位 .NET Framework 项目的 WinForm 设计器选择

在客户反馈的推动下,Visual Studio 2022 向64位架构过渡,标志着增强开发体验的关键一步。正如 Klaus Loffelmann 在他的博客文章中所描述的那样,这种转换增强了整体性能和响应性,特别是在处理资源密集型任务和大型代码库时。然而,这种演变给一些在 Visual Studio 2022 中使用 Windows 窗体设计器的 .NET Framework 项目带来了显著的挑战。挑战在于无法在 .NET Framework 项目中设计依赖32位引用的 Form,这是固有技术限制的结果,64位的 devvenv .exe Visual Studio 进程无法加载32位编译的引用。对于使用 Windows Forms .NET Framework 项目的用户来说,这个特定的障碍已经成为一个显著的的采用性障碍,这些项目广泛地利用了 ActiveX/COM 控件或嵌入在32位程序集中的其他自定义控件。到目前为止,这种情况的解决方案是使用 Visual Studio 2019,其中 Windows 窗体设计器作为32位进程运行,以适应这些项目的特定需求。
认识到这种转变带来的限制,以及它对开发人员的影响,我们一直在努力开发功能,为在最新的 Visual Studio 环境中设计传统的 WinForms 32位 .NET Framework 应用程序铺平道路。虽然这些最初的努力不会全面解决整个问题,但我们的目标是为用户扫清障碍,并让过渡到64位的 Visual Studio 2022 更顺利。
在最新的 Visual Studio 2022 版本 v17.9 中,WinForms 团队引入了一个预览特性——对 .NET Framework 项目的进程外设计器支持。使用 .NET Framework 的进程外设计器的能力目前处于早期预览状态,我们急切地寻求开发人员的反馈,以完善和改进其功能。值得注意的是,Visual Studio 17.9 版本带来了重要的增强,包括:
- 改进了 .NET Framework 项目的类型解析
- ActiveX/COM 支持 .NET Framework 和 .NET 项目
- 一个新的设计器选择功能,用于监视 .NET Framework 项目中的32位程序集加载失败
这些新增功能表明我们致力于积极参与社区,了解他们项目的复杂性,并稳步构建功能,为最佳的 Visual Studio 体验铺平道路。我们希望这种方法能够使开发人员更容易地最终迁移到 .NET ,以获得更现代平台的所有好处,而无需完全重写用户界面。
什么是设计器选择功能?
当 WinForms 设计器检测到32位程序集加载失败时,它会显示以下对话框,其中提供了为开发人员的项目选择适当的设计器的选项:

选择“Yes”,项目将被重新加载,Windows 窗体进程外设计器将开始发挥作用。如果项目的目标是x86,设计器将启动一个32位进程来在设计器中呈现 Form。该进程标识为“FxDesignToolsServer.exe”。在这个进程中,控件程序集被加载,并执行 InitializeComponent 方法中与指定框架对齐的代码。
如果选择“No”,项目将继续使用进程内设计器,尽管您仍然无法设计引用32位组件的Form,因为32位二进制文件无法在64位进程中加载。
使用“Yes/No”按钮,设计器选择将仅为当前 Visual Studio 实例记住此设置。若要自动将设计器选择添加为项目配置属性,请启用“Remember for current project”选项。它将添加“UseWinFormsOutOfProcDesigner”属性到每个项目配置。WinForms 设计器将读取此属性值,以便在下次在 Visual Studio 中打开项目时自动选择所需的设计器版本(进程内或进程外)。下面是添加此属性后的示例项目配置:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<OutputPath>bin\Debug\</OutputPath>
<UseWinFormsOutOfProcDesigner>True</UseWinFormsOutOfProcDesigner>
</PropertyGroup>
请注意,设计器选择功能目前处于以下预览功能标志下,在 Visual Studio 2022 17.9中默认启用:

您可以在 Visual Studio的Tools -> Options -> Preview Features 下启用或禁用该特性。
当您在 .NET Framework 项目中使用进程外设计器时,会显示下面的信息栏:

这个特性能做什么,不能做什么
与将所有与第三方控件相关的程序集加载到 Visual Studio 进程中的进程内设计器相比,进程外设计器要更加挑剔;它将设计时程序集加载到专用服务器进程或客户端 Visual Studio 进程中。由于进程外设计器的客户机-服务器架构,程序集加载中的这种区别是必要的,因此,第三方控件供应商需要使用新的设计器 SDK 来为进程外设计器提供控件。请注意,为客户端和服务器进程创建不同的设计时程序集对于支持简单的场景来说并不是必需的,但是对于更高级的场景来说却是必需的。因此, .NET Framework 项目的进程外设计器将无法处理为进程内设计环境设计的所有第三方控件。如果遇到这样的控件,则可能会忽略与设计器无法呈现的控件相关的代码。因此,我们建议您事先创建项目的备份。
- 项目中引用的控件将不会出现在工具箱中,在解决方案中的其他形式中使用。我们的目标是在即将发布的版本中添加此功能。
- 当在进程外设计器中加载具有自定义 CodeDOM 序列化器的控件时,设计器目前将忽略 InitializeComponent 中生成的代码(因为它不能像以前那样运行 CodeDOM 序列化器)。我们希望在未来的版本中添加警告,让您提前知道项目将无法加载特定的组件。
旁注:您可能会发现,在使用新的 SDK 风格项目文件的 .NET Framework 项目中,与旧的传统 csproj 文件相比, InitializeComponent 方法生成的代码有很大的不同。这是因为进程外设计器在遇到 SDK 风格的项目时,会在后台利用 Roslyn 进行代码生成,而不是使用较旧的 CodeModel 技术。从长远来看,这对您的代码来说是一个巨大的胜利,并且支持未来的多目标和迁移路径。对于那些遗留的 csproj 风格项目生成的代码可能会有一些小的调整,但这些将不那么重要,如果在 VS 2019 中打开相同的项目,将会工作得很好。
进程外设计器支持 .NET Framework 项目的路线图
正如之前提到的,我们计划在即将发布的 Visual Studio 版本中增加对进程外设计器的以下特性的支持:
- 增强工具箱对解决方案中引用的控件的支持。
- 当设计器无法使用自定义 CodeDOM 序列化器加载控件时,会发出更详细的警告。
如何为64位世界做准备?
对于在代码中使用传统32位组件的 WinForms .NET Framework 应用程序的开发人员来说,这个特性并不是为了使过渡到 Visual Studio 2022 没有任何动作。自从创建了许多遗留组件以来,开发环境发生了巨大的变化。例如,它们中的许多不符合今天的代码安全标准。设计器选择功能,以及在进程外设计器中对 .NET Framework WinForms 应用程序的相关支持,旨在为您的应用程序提供最终解决方案的短期桥梁。从长远来看,目前使用32位组件的应用程序有两个潜在的选择:要么将组件升级到 AnyCPU 或64位,要么最好将应用程序升级到 .NET 8 或更高版本。.NET 8 平台在 WinForms 应用程序中完全支持32位 COM 和 ActiveX 控件。还有一个强大的第三方控制供应商生态系统,每天都在增长。
要了解更多关于 WinForms 采用32位组件的策略,请参阅 Klaus Loffelmann 和 Merrie McGaw 最近的博客:《WinForms in a 64-Bit world – our strategy going forward》。
结语
我们感谢您花时间报告问题/建议,并希望您在使用 Visual Studio 时继续给我们反馈,告诉我们您喜欢什么以及我们可以改进什么。您的反馈对于帮助我们使 Visual Studio 成为最好的工具至关重要!您可以通过开发者社区与我们分享反馈,通过发送反馈来报告问题或分享您的建议,推动对新功能或现有功能的改进。
通过在 YouTube, Twitter, LinkedIn, Twitch 和 Microsoft Learn 上关注我们与 Visual Studio 团队保持联系。
原文链接:https://devblogs.microsoft.com/visualstudio/winforms-designer-selection-for-32-bit-net-framework-projects/

【译】32位 .NET Framework 项目的 WinForm 设计器选择的更多相关文章
- 微软:正式发布针对 .NET Core的 Winform 设计器
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://devblogs.microsoft.com/dotnet/windows-for ...
- VS2022 17.1.6在windows10下打开winform设计器报timed out while connecting to named pipe错误
.net 6.0的项目,vs2022 17.1.6在windows10下打开winform设计器报timed out while connecting to named pipe错误,同样的项目在wi ...
- WinForms项目升级.Net Core 3.0之后,没有WinForm设计器?
目录 .NET Conf 2019 Window Forms 设计器 .NET Conf 2019 2019 9.23-9.25召开了 .NET Conf 2019 大会,大会宣布了 .Net Cor ...
- iOS-程序发布-32位和64位系统的兼容
在苹果推出iPhone5S时,64位的应用就走到了眼前.当时就看见苹果官方资料宣布iOS7.x的SDK支持了64位的应用,而且内置的应用都已经是64位. 我记得自己刚刚接触电脑时还有16位的系统,指针 ...
- iOS上应用如何兼容32位系统和64位系统
在苹果推出iPhone5S时,64位的应用就走到了眼前.当时就看见苹果官方资料宣布iOS7.x的SDK支持了64位的应用,而且内置的应用都已经是64位. 我记得自己刚刚接触电脑时还有16位的系统,指针 ...
- iOS如何兼容的应用程序32位系统和64Bit系统
苹果发布iPhone5S时刻,64应用程序位去了眼前.当时我看到苹果公布的官方数据iOS7.x的SDK支撑64位应用程序.而内置的应用程序已经64位置. 我记得自己刚刚接触电脑时还有16位的系统,指针 ...
- Wow6432Node(32位程序的注册表内容都在这个节点下,也可直接使用%systemroot%\syswow64\regedit进行编辑)
64 位版本 Windows 中的注册表分为 32 位注册表项和 64 位注册表项.许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然. 64 位版本 Windows 包含的默认 64 ...
- 9.下载ffmpeg、使QT支持同时编译32位和64位
1.FFMPEG下载 进入http://ffmpeg.org/download.html,如果下载源码,则在右下方: 如果在linux中,直接输入git clone https://git.ffmpe ...
- IOS是否存在32位和64位版本的区分
苹果于2013年9月推出了iPhone 5S新手机,采用的全新A7处理器其最大特色就是支持64位运算.其64位A7处理器的使用意味着iPhone性能会大有提高,性能和速度更加出色:而要到达到这样的性能 ...
- 32位centos下安装jdk1.7报Permission denied处理方式
本文转载自:http://blog.csdn.net/snowwhitewolf/article/details/50287877 环境:centos5.8 32位jdk-7u71-Linux-i58 ...
随机推荐
- gym中的discrete类、box类和multidiscrete类简介和使用
相关文章: Box() dict()可用于创建连续的空间:OpenAI Gym Discrete和Box spaces同时存在,代码该怎么写:gym中各种离散连续写法 解读gym中的action_sp ...
- 【五】强化学习之Sarsa、Qlearing详细讲解----PaddlePaddlle【PARL】框架{飞桨}
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...
- Windows平台安装Oracle11.2.0.4客户端报错INS-30131
之前为解决EXP-00003错误给出了安装Oracle11.2.0.4的解决方案,自己测试是没问题的,客户自己安装反馈遇到报错INS-30131,MOS有一篇文章: E1: DB: Error INS ...
- linux下进行MCU开发环境搭建
why 为什么要搭建此开发环境? 在linux环境下开发可以利用shell命令实现对文件的批处理 伟大的程序员应该都用类unix系统! 可以实现对底层编译技术的了解,以便于更好的掌握嵌入式技术 通用性 ...
- AgileConfig-1.9.0 发布,支持 MongoDB 存储
Hello 大家好,先祝福大家新年快乐. AgileConfig 1.9.0 版本终于赶在农历年前发布了. Mongodb 当前做为一款非常成熟的 Nosql 产品,已经有越来越多的产品或项目基于它来 ...
- 听说有 Hugging Face 陪伴的春节,是这样的…
辞旧迎新春节到,家家户户好热闹.Hugging Face 中国团队成员祝各位社区成员们新春快乐,万事如意! 过去的一年我们持续看到 AI 技术的腾飞和发展,以及诸多机构为开源 AI 作出巨大的贡献.非 ...
- NC20139 [JLOI2014]松鼠的新家
题目链接 题目 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树& ...
- PCIE分层结构
PCIe分层结构 绝大多数的总线或者接口,都是采用分层实现的.PCIe也不例外,它的层次结构如下: PCIe定义了下三层(彩色部分):事务层(Transaction Layer),数据链路层(Data ...
- Linux常用的20个命令(下)
无论你是后端程序员还是前端程序员,都避免不了和Linux打交道.上篇介绍了Linux常用的20个命令其中的10个,本文继续介绍剩下的10个命令. 11.man 命令 manual的缩写,即使用手册的意 ...
- 基于 log4j2 插件实现统一日志脱敏,性能远超正则替换
前言 金融用户敏感数据如何优雅地实现脱敏? 日志脱敏之后,无法根据信息快速定位怎么办? 经过了这两篇文章之后,我们对日志脱敏应该有了一定的理解. 但是实际项目中,我们遇到的情况往往更加复杂: 1)项目 ...