Как использовать System.Windows.Forms в библиотеке классов.NET Core

Я создал библиотеку классов.NET Core и попробую построить ее на основе среды net40. Я хочу использовать класс Clipboard из сборки System.Windows.Forms. Как я могу это сделать?

Мой файл project.json:

{
    "version": "1.0.0-*",

    "dependencies": {
        "NETStandard.Library": "1.6.0"
    },

    "frameworks": {
        "netstandard1.6": {
            "imports": "dnxcore50",
            "buildOptions": {
                "define": [
                    "NETCORE"
                ]
            },
            "dependencies": {
                "System.Threading": "4.0.11",
                "System.Threading.Thread": "4.0.0",
                "System.Threading.Tasks":  "4.0.11"
                }
        },
        "net40": {
            "buildOptions": {
                "define": [
                    "NET40"
                    ]
                },
            "dependencies": {
                // dependency should be here but there is no such dll
            }
        }
    }
}

Весь мой специальный код net40 находится под NET40. Какие-нибудь мысли?

4 ответа

Решение

Что вам нужно "frameworkAssemblies", например:

"frameworks": {
  "netstandard1.6": {
    "dependencies": {
      "NETStandard.Library": "1.6.0"
    }
  },
  "net40": {
    "frameworkAssemblies": {
      "System.Windows.Forms": {}
    }
  }
}

Работать с Clipboard также требует установки основного потока как STA, поэтому не забудьте добавить [STAThread] в Main() в вашем приложении.

Для VS2019 .NET Core 3.1:

  1. щелкните правой кнопкой мыши проект и выберите " Выгрузить проект".
  2. щелкните проект правой кнопкой мыши и выберите "Редактировать foobar.csproj"
  3. Пример использования WPF и Winforms в.NET Core 3.1: я добавил теги UseWPF и UseWindowsForms. Также я изменилMicrosoft.NET.Sdk к Microsoft.NET.Sdk.WindowsDesktop иметь возможность использовать также wpf.
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup Label="Globals">
    <SccProjectName>SAK</SccProjectName>
    <SccProvider>SAK</SccProvider>
    <SccAuxPath>SAK</SccAuxPath>
    <SccLocalPath>SAK</SccLocalPath>
  </PropertyGroup>

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UseWPF>true</UseWPF>
    <UseWindowsForms>true</UseWindowsForms>
  </PropertyGroup>
...
  1. сохраните и снова щелкните проект правой кнопкой мыши и выберите Reload Project

для .Net 6 файл .csproj должен содержать:

      <PropertyGroup>
     <TargetFramework>net6.0-windows</TargetFramework>
     <UseWPF>true</UseWPF>
     <UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>

Обратите внимание на « -windows » в целевой структуре.

UseWPFявляется необязательным.

Смешивание фреймворков - это, безусловно, один из способов, но тогда зачем вам использовать.NET Core?

Но что вы можете сделать, это перенести моно реализацию System.Windows.Forms на NetStandard.
Например, здесь: https://github.com/ststeiger/System.CoreFX.Forms

Другие вопросы по тегам