【译】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 ...
随机推荐
- 开源IM项目OpenIM新版本发布-生产环境需更新
项目简介 Android体验地址:https://www.pgyer.com/OpenIM 注册后自动加入组织,和群聊 群聊页面 工作台 工作台,业务可以通过jssdk自由扩展自身业务 工作圈 工作圈 ...
- 从Spring源码看Spring如何解决循环引用的问题
Spring如何解决循环引用的问题 关于循环引用,首先说一个结论: Spring能够解决的情况为:两个对象都是单实例.且通过set方法进行注入. 两个对象都是单实例,通过构造方法进行注入,Spring ...
- vim 从嫌弃到依赖(3)——vim 普通模式
在上一篇中,我们提到vim的几种模式,并且给出了一些基本的操作命令,包括移动光标,删除.替换操作.并且给出了几个重要的公式,理解这个公式对于理解vim和提高使用vim的效率来说至关重要.所以在这篇文章 ...
- 关于Oracle RAC调整网卡MTU值的问题
在Oracle RAC的环境中,如果我们发现OSW监控数据显示包重组失败率过高,就需要引起足够的重视,因为这很可能会引发member kill/Node kill等重大故障,甚至在有些场景会连带影响到 ...
- Hive压缩和存储
1.压缩 (1)Hive支持的压缩编码 压缩格式 工具 算法 文件扩展名 是否可切分 对应的编码/解码器 DEFLATE 无 DEFLATE .deflate 否 org.apache.hadoop. ...
- vue3的宏到底是什么东西?
前言 从vue3开始vue引入了宏,比如defineProps.defineEmits等.我们每天写vue代码时都会使用到这些宏,但是你有没有思考过vue中的宏到底是什么?为什么这些宏不需要手动从vu ...
- Oracle数据库报ORA-01078和LRM-00109错误解决方法
创建实例后,进入sqlplus启动报错: sqlplus / as sysdba; SQL*Plus: Release 11.1.0.6.0 - Production on Wed A ...
- C++ 多线程的错误和如何避免(12)
std::async 在简单的 IO 上比 std::thread 更有优势 前提:如果我们只需要一些异步执行的代码,这样不会阻塞主线程的执行,最好的办法是使用 std::async 来执行这些代码. ...
- Caused by: com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed
报错场景:spring boot+mybatis,线程池执行批量任务.springboot正常启动后,定时任务中数据库查询报错.报错信息如下: 1 Caused by: org.apache.ibat ...
- 硬件开发笔记(九): 硬件开发基本流程,制作一个USB转RS232的模块(八):创建asm1117-3.3V封装库并关联原理图元器件
前言 有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了一个创建asm1117-3.3V封 ...