在.NET Core类库中使用Windows Forms - .NET Core控件库

15

我正在尝试创建一个 .net core 3 类库,它引用了 .net core 3 版本的 winform(这样该程序集本身就可以被 .net core 3 WinForm 程序集引用)。

一个新的 .net core WinForm 项目引用了 Microsoft.WindowsDesktop.App.WindowsForms,但我找不到任何名为该名称的 nuget 包。

我需要做什么才能引用 .net core 3 的 winform?


“net core 3 winform” 是一种东西吗?您是在尝试将旧的winforms应用程序迁移到.net core吗? - Sinatr
这个链接看起来对我来说还很beta,谷歌上说发布日期是2019年9月。没有表单设计器.. 哈哈。 - Sinatr
我正在尝试从头开始编写(而不是迁移)一个WinForm助手程序集,以便在.NET Core 3 WinForm应用程序之间共享。有一个UI来创建.NET Core 3 WinForm应用程序。我只是找不到一种方法来创建引用WinForm的.NET Core 3类程序集。 - Charles
5个回答

26

更新:在较新的VS 2019版本中(我试过版本16.8.2),已经为.NET Core提供了Windows Forms Control Library项目模板。

目前Windows Forms .NET Core处于预览模式,我不知道在VS 2019 16.2.2中是否有任何官方Nuget包或Windows Forms Control Library项目模板。

但是,您可以使用以下说明来创建Windows Forms Control Library

  1. 添加一个类型为Class Library (.NET Core)的新项目
  2. 创建项目后,在项目文件上右键单击并选择编辑项目文件
  3. 将项目SDK更改为<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  4. 通过添加<UseWindowsForms>true</UseWindowsForms>来指定Windows Forms作为UI技术。

现在,项目文件应如下所示:

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>
</Project>

现在,您可以向此项目添加Windows表单元素,如 Form UserControl ,并且可以毫无问题地构建该项目。


@Charles 我没有提到这个原因是因为即使没有它,它也应该能够正常工作(事实上对我来说一直都很好用)。无论如何,我已经添加了它。 - Reza Aghaei
1
你好Reza,非常好的答案,它适用于netcoreapp3.0。我有一种感觉,在它开始工作之前,我必须先关闭Visual Studio。你知道如何让它也适用于.netstandard2.0和.netstandard2.1吗?我还没有能够做到这一点。 - JRB
1
@JRB 你最终是否找到了如何在Standard 2.1中实现这个功能的方法? - pushkin
@Pushkin,使用netstandard 2.0和2.1编译类库并不是难题,但在我的解决方案中,我有WCF和EF Core项目,我无法让所有项目一起使用netstandard 2.0和2.1类库工作,所以我放弃了。然而,我在使用netcoreapp3.1编译的类库上取得了一些成功。 - JRB
1
@JRB 感谢您的更新。这似乎是使WinForms工作的正确方法:将类程序集用于核心而不是标准。 - pushkin
显示剩余8条评论

8

我有一个核心 3.1 的 web 应用程序,引用了一个依赖于 System.Windows.Forms 的 Framework 4.5.2 项目。对我来说,解决方法是在 Web 应用程序的 csproj 文件中添加以下行:

FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms"

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFrameworks>netcoreapp3.1</TargetFrameworks>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

  <ItemGroup>
    <FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" />
  </ItemGroup>

</Project>

这对我的情况起作用了,谢谢! - Todd Vance

6

目前被认可的答案似乎有点过时。最新的语法要求在TargetFramework标记中指定目标,而不是在Sdk标记中指定:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Library</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>

</Project>

更多信息请参见此处


3

或者,您可以添加一个新的Windows Form类型项目,然后将输出类型设置为库。

<OutputType>Library</OutputType>

1

对于我来说,在我的项目中,我需要使用net5以下内容

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
      <TargetFramework>net5.0-windows</TargetFramework>
      <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接