在客户反馈的推动下,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 设计器选择的更多相关文章

  1. 微软:正式发布针对 .NET Core的 Winform 设计器

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://devblogs.microsoft.com/dotnet/windows-for ...

  2. 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 ...

  3. WinForms项目升级.Net Core 3.0之后,没有WinForm设计器?

    目录 .NET Conf 2019 Window Forms 设计器 .NET Conf 2019 2019 9.23-9.25召开了 .NET Conf 2019 大会,大会宣布了 .Net Cor ...

  4. iOS-程序发布-32位和64位系统的兼容

    在苹果推出iPhone5S时,64位的应用就走到了眼前.当时就看见苹果官方资料宣布iOS7.x的SDK支持了64位的应用,而且内置的应用都已经是64位. 我记得自己刚刚接触电脑时还有16位的系统,指针 ...

  5. iOS上应用如何兼容32位系统和64位系统

    在苹果推出iPhone5S时,64位的应用就走到了眼前.当时就看见苹果官方资料宣布iOS7.x的SDK支持了64位的应用,而且内置的应用都已经是64位. 我记得自己刚刚接触电脑时还有16位的系统,指针 ...

  6. iOS如何兼容的应用程序32位系统和64Bit系统

    苹果发布iPhone5S时刻,64应用程序位去了眼前.当时我看到苹果公布的官方数据iOS7.x的SDK支撑64位应用程序.而内置的应用程序已经64位置. 我记得自己刚刚接触电脑时还有16位的系统,指针 ...

  7. Wow6432Node(32位程序的注册表内容都在这个节点下,也可直接使用%systemroot%\syswow64\regedit进行编辑)

    64 位版本 Windows 中的注册表分为 32 位注册表项和 64 位注册表项.许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然. 64 位版本 Windows 包含的默认 64 ...

  8. 9.下载ffmpeg、使QT支持同时编译32位和64位

    1.FFMPEG下载 进入http://ffmpeg.org/download.html,如果下载源码,则在右下方: 如果在linux中,直接输入git clone https://git.ffmpe ...

  9. IOS是否存在32位和64位版本的区分

    苹果于2013年9月推出了iPhone 5S新手机,采用的全新A7处理器其最大特色就是支持64位运算.其64位A7处理器的使用意味着iPhone性能会大有提高,性能和速度更加出色:而要到达到这样的性能 ...

  10. 32位centos下安装jdk1.7报Permission denied处理方式

    本文转载自:http://blog.csdn.net/snowwhitewolf/article/details/50287877 环境:centos5.8 32位jdk-7u71-Linux-i58 ...

随机推荐

  1. 8.1 Windows驱动开发:内核文件读写系列函数

    在应用层下的文件操作只需要调用微软应用层下的API函数及C库标准函数即可,而如果在内核中读写文件则应用层的API显然是无法被使用的,内核层需要使用内核专有API,某些应用层下的API只需要增加Zw开头 ...

  2. T406696 『STA - R4』冰红茶 题解

    题目链接:冰红茶 比较有意思的套路题(前提是接触过) 首先,一个最基本的线段树包含两种操作的板子要会,分别为区间赋值与区间加,同时维护区间最值.这个挺简单的,区间赋值优先级高于区间加,可以将区间加覆盖 ...

  3. 《Mastering ABP Framework》图书目录

    以下是<Mastering ABP Framework>的中文目录,目前个人正在进行翻译中,如果您对本书感兴趣,也想使用或者学习框架设计,可以访问该地址进行登记,本文只是一个目的的展示和购 ...

  4. 20.1 DLL模块的显式加载和符号链接--《Windows核心编程》

    一.显式加载DLL模块使用函数 LoadLibrary/LoadLibraryEx HINSTANCE LoadLibrary(PCTSTR pSzDLLPathName); HINSTANCE Lo ...

  5. IIS的基本安装和配置

    实验介绍:IIS的作用 IIS是web服务器中常见的一种.当客户端想访问某个域名时,向web服务器发出请求.web服务器返回网页的代码做出回应.客户端解析代码生成网页. 一:安装IIS 1.打开一台w ...

  6. Java-统计程序运行的时长(计算两个时间相差的毫秒数、秒数)

    最近在做Hbase的查询性能验证,需要统计查询的执行时长,所以需要统计开始时间和结束时间的时间差. 下面是使用SimpleDateFormat和Date计算时间差(相差毫秒数)的程序示例,仅供参考. ...

  7. OGG-Postgres实时同步到MySQL

    (一)数据库信息 名称 源端数据库 目标端数据库 数据库类型 Postgresql 12.4 MySQL 5.7 IP地址 20.2.127.23 20.2.127.24 端口 5432 3306 数 ...

  8. JS Leetcode 690. 员工的重要性 题解分析

    壹 ❀ 引 本题来自LeetCode690. 员工的重要性,难度简单,题目描述如下: 给定一个保存员工信息的数据结构,它包含了员工 唯一的 id ,重要度 和 直系下属的 id . 比如,员工 1 是 ...

  9. Miniconda 安装和使用笔记

    Miniconda是Anaconda的简化版, 可以管理多个Python版本的环境. 实际使用的话, 占用的空间不会很小, 我跑一些正常的应用后, 安装目录占用空间4.3GB, 安装建议要预留10到2 ...

  10. form表单如何实现ajax提交

    最近在开发一个游戏网关的后台管理系统,总结了下中间碰到的一些问题. 之一就是:form表单如何实现ajax提交? 问题:在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转, ...