39

I've created .NET Core class library and try to build it against net40 framework. I want to use Clipboard class from System.Windows.Forms assembly. How can I do this?

My project.json file:

{
    "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
            }
        }
    }
}

All my net40 specific code is under NET40 define. Any thoughts?

Alexander Buts
  • 561
  • 1
  • 4
  • 7
  • 1
    Yes, you are right. But also you can create simple console application with .NET Core. I tried to create a custom console for my needs with copy/paste functionality, so I need to copy data from clipboard and paste it to my console. – Alexander Buts Jul 19 '16 at 14:32
  • So you have to found another Class which is part of the .NET Core to work with the clipboard or switch to a Console App which target "Legacy .Net". – Marco Guignard Jul 19 '16 at 14:59
  • 1
    @MarcoGuignard That's exactly what the `net40` framework is for. It lets you write libraries and applications that work on both .Net Core and .Net Framework, while taking advantage of .Net Framework-specific features, when you can. – svick Jul 20 '16 at 01:31

4 Answers4

62

For VS2019 .NET Core 3.1:

  1. right-mouse click on the project and select Unload Project
  2. right-mouse click on the project and select "Edit foobar.csproj"
  3. Example of using WPF and Winforms in .NET Core 3.1: where I added the UseWPF and UseWindowsForms tags. Also I changed Microsoft.NET.Sdk to Microsoft.NET.Sdk.WindowsDesktop to be able to use also 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. save and right-mouse click on the project again and select Reload Project
juFo
  • 17,849
  • 10
  • 105
  • 142
42

for .Net 6 the .csproj file should contain:

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

Note the "-windows" in the target framework.

UseWPF is optional.

Louis Somers
  • 2,560
  • 3
  • 27
  • 57
  • you only need to add `-windows` to the end of `TargetFramework` Value/Content. `UseWPF` and `UseWindowsForms` isnt quite necessary. – Nullify Mar 17 '23 at 17:26
  • @Nullify you are wrong, once there is a call to anything "using" system.windows.form, it will fail at runtime if you don't put the UserWindowsForms COMBINED WITH -windows – Christophe Chenel Apr 05 '23 at 21:05
  • 1
    @ChristopheChenel I see. Guess i learn something new every day lmao – Nullify Aug 05 '23 at 19:12
20

What you need is "frameworkAssemblies", for example:

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

Working with Clipboard also requires setting the main thread as STA, so don't forget to add [STAThread] to Main() in your application.

svick
  • 236,525
  • 50
  • 385
  • 514
1

Note: the bellow was for .NET Core < 3, which came without WinForms on Windows.

However, it is still valid if you need to compile something with WinForms on Linux, since .NET Core WinForms only runs on Windows.

Mixing frameworks is certainly one way to go - but then, why do you use .NET Core ?

But what you can do is port the mono implementation of System.Windows.Forms to NetStandard.
Such as here: https://github.com/ststeiger/System.CoreFX.Forms

Stefan Steiger
  • 78,642
  • 66
  • 377
  • 442