Import Windows Forms to console application in C#

I have a console application and I just want to display a MessageBox at some point.

I found a page that stated that I could do it by adding a reference to the assembly. However, just adding using System.Windows.Forms doesn’t work (CS02348: it doesn’t exist in the namespace and I’m probably missing an assembly reference).

However, I can only seem to add COM references to my project. When I looked for a way to display the assembly panel, I found this page that seems to state that I should already have it.

According to this tutorial, I should manually browse and seek in C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App.

I tried with C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\7.0.2\System.Windows.Forms.dll and C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.13\System.Windows.Forms.dll. With both of them, I get the error CS1705:

Error CS1705 Assembly ‘System.Windows.Forms’ with identity
‘System.Windows.Forms, Version=7.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089’ uses ‘System.Runtime,
Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’
which has a higher version than referenced assembly ‘System.Runtime’
with identity ‘System.Runtime, Version=6.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a’

I just deleted the System.Windows.Forms.dll I manually imported and my *.csproj file looks like this:

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <Reference Include="RandomLibrary">
      <HintPath>RandomLibrary.dll</HintPath>
    </Reference>
  </ItemGroup>

</Project>

I need it to stay in 6.0 for the LTS.

Why don’t I have this assembly tab?
How to add reference to System.Windows.Forms? Why did I get the same message with version 6.0.13 than with version 7.0.2?

>Solution :

You don’t have to add anything in your Dependencies or manually reference any dlls. You just have to add a few lines to your csproj file.

Here is a fresh one generated by the console app wizard from Visual Studio:

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

If you want to use win forms, modify it thus (right click on the project, select ‘Unload project’ or just edit it manually in a text editor):

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0-windows</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <UseWindowsForms>true</UseWindowsForms>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Note the addition of -windows after net6.0 as well as <UseWindowsForms>true</UseWindowsForms>.

Then you can use win forms and see console output:

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
string message = "Hello,";
string caption = "World!";

MessageBoxButtons buttons = MessageBoxButtons.YesNo;
DialogResult result;

// Displays the MessageBox.
result = MessageBox.Show(message, caption, buttons);

enter image description here

Leave a Reply