我正在使用 Visual Studio 2022,尝试将一些可以添加到 Windows 窗体设计器的组件和用户控件从 NET Framework 4.8 迁移到 NET Core 6 项目的 Windows 窗体设计器,但我遇到了我不知道如何克服的障碍。
我用以下示例简化了我的问题:
我有一个基于 NET Core 6.0 构建的面向 Windows 操作系统的类库项目。
这是.csproj文件内容:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
</Project>
这是我的项目中包含的唯一类:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Runtime.Versioning;
namespace MyCustomControls {
[DisplayName(nameof(MyCustomControl))]
[Description("My Custom Control.")]
[DesignTimeVisible(true)]
[ToolboxItem(true)]
[DesignerCategory(nameof(UserControl))]
[ToolboxBitmap(typeof(Control), "Control.bmp")]
[ComVisible(true)]
[SupportedOSPlatform("windows")]
public class MyCustomControl : UserControl {
public MyCustomControl() {}
}
}
现在,我在 NET Core 6.0 下创建了一个也面向 Windows 的 Windows 窗体应用程序。
这是.csproj文件内容:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
</Project>
问题是,当我将包含示例用户控件的 file.dll 拖放到控件工具箱时,它没有添加。
什么也没有发生,没有警告,没有错误,什么也没有,Visual Studio 只是没有将我的自定义用户控件添加到控件工具箱。我找不到任何关于为什么会发生这种情况的信息和/或在使用 NET Core 时在控件工具箱中正确添加自定义用户控件的步骤。
我已确保 Visual Studio 选项中的 AutoToolboxPopulate 选项已在
Options -> General -> Windows Forms Designer
处启用。
在我的 NET Core 的 Windows 窗体项目中,如果我创建一个新的类文件并粘贴用户控件的代码,则编译后该控件会自动添加到控件工具箱中:
(当然仅针对该项目)
所以我开始认为也许我没有错过在用户控件类的类型定义上添加必需的类属性,也许真正的问题可能是 .NET Core 缺乏从“外部”DLL 文件,但我坚持认为我找不到任何有关将自定义用户控件添加到 NET Core 解决方案的 Windows 窗体设计器的官方文档或文章,所以我不能肯定地说。
我不认为我的 Visual Studio 安装已损坏,我认为这只是我对 .NET Core 缺乏经验的问题,所以我可能不知道如何以正确的方式执行此操作以显示NET Core 上 Windows 窗体设计器的控件工具箱中的用户控件,但无论如何我尝试了这个建议,以防万一:
重置工具箱,关闭Visual Studio并删除相关的工具箱缓存文件(在我的例子中,我只找到一个名为:
ToolboxItemDiscoveryCache.{long id here}
的文件),它并没有解决问题。
该建议与此问题中的其他一些建议一起列出:
...这些建议都不适合我,尽管该用户的问题和场景与我的有很大不同。
我发现我认为可能是从 NET Core DLL 文件导入/填充用户控件的能力的证据,对于 NET Core Windows 窗体设计器来说,这是当前不支持的功能:
@Klaus Loeffelmann [MSFT] | 2023 年 8 月 30 日:
目前,WinForms for .NET(5、6、7、8)仅支持 Toolbox 控制措施的部署,这些控制措施要么是解决方案的一部分,要么是 作为 NuGet 包导入。我们的目标是 Visual Studio 2022 17.8 为控件/工具箱部署提供 DLL 参考支持。直到 那么,请使用最佳实践,即打包您的控件库 作为 NuGet 包,然后将其导入到相应的 WinForms 中 项目。
全面讨论:
...这个问题似乎自 2021 年以来就已为人所知,因此 Visual Studio 可能永远不会获得此支持。
自 2021 年以来,他们甚至无法在尝试导入控件时添加简单的警告消息,以防止像我这样受影响的用户浪费大量时间尝试事物、试图了解到底发生了什么并进行研究在互联网上。从 Visual Studio 开发团队的角度来看,我觉得这令人难以置信。