.NET
console application
message box
C#
programming tutorial

Show message Box in .net console application

Interview Questions practice on Codemia

Over 8,000 real interview questions from top companies, searchable by company and role.

Browse interview questions

Introduction

A .NET console application can show a message box, but that only makes sense on Windows because the dialog comes from a desktop UI framework such as Windows Forms or WPF. The important distinction is that the project is still a console app; you are simply referencing a Windows UI library for one dialog call.

Use Windows Forms in a Console App

In a modern SDK-style project, target Windows and enable Windows Forms support in the project file:

xml
1<Project Sdk="Microsoft.NET.Sdk">
2  <PropertyGroup>
3    <OutputType>Exe</OutputType>
4    <TargetFramework>net8.0-windows</TargetFramework>
5    <UseWindowsForms>true</UseWindowsForms>
6  </PropertyGroup>
7</Project>

Then you can call MessageBox.Show() from Program.cs:

csharp
1using System;
2using System.Windows.Forms;
3
4[STAThread]
5internal static class Program
6{
7    private static void Main()
8    {
9        DialogResult result = MessageBox.Show(
10            "Process completed successfully.",
11            "Console Tool",
12            MessageBoxButtons.OKCancel,
13            MessageBoxIcon.Information
14        );
15
16        Console.WriteLine($"User selected: {result}");
17    }
18}

The [STAThread] attribute matters because many Windows UI components expect a single-threaded apartment. Without it, dialog behavior can be unreliable.

When This Approach Makes Sense

Using a message box in a console app is reasonable when:

  • the tool is Windows-only
  • you need a quick confirmation dialog
  • the rest of the program is still command-line driven

Examples include internal admin utilities, installer helpers, or migration tools that mostly run in a terminal but occasionally need a blocking prompt.

If the application is meant to be cross-platform or fully scriptable, a console prompt is usually better:

csharp
Console.Write("Continue? (y/n): ");
string? answer = Console.ReadLine();

A GUI dialog breaks automation, remote shells, and headless execution environments.

WPF Is Also Possible

If you already reference WPF instead of WinForms, you can show a message box there too:

csharp
1using System;
2using System.Windows;
3
4[STAThread]
5internal static class Program
6{
7    private static void Main()
8    {
9        MessageBox.Show("Task finished.", "Console Tool");
10        Console.WriteLine("Dialog closed.");
11    }
12}

For a simple dialog in a console program, Windows Forms is usually the lighter choice. WPF makes more sense when the project already depends on WPF types or may evolve toward a fuller desktop UI.

Think About User Experience

Mixing console output and modal dialogs can confuse users if it is done carelessly. If the tool is launched from a script or scheduled task, the dialog may appear on a desktop session that no one is watching. If the program runs in a server context, the dialog may never be usable at all.

A good rule is to treat message boxes as an interactive convenience, not as a required control path for background tools. If the result matters, also log or print the message to the console.

csharp
1Console.WriteLine("About to show confirmation dialog.");
2
3DialogResult result = MessageBox.Show(
4    "Delete temporary files?",
5    "Cleanup",
6    MessageBoxButtons.YesNo,
7    MessageBoxIcon.Warning
8);
9
10Console.WriteLine($"Choice: {result}");

That way the console transcript still explains what happened.

Common Pitfalls

The first pitfall is trying this on a non-Windows target framework. A normal net8.0 console app without -windows targeting will not support Windows Forms.

Another common issue is forgetting [STAThread]. The program may compile, but UI components expect the correct apartment state.

Developers also sometimes use a message box in tools that are meant for automation. A hidden modal dialog can make a CI job or scheduled process appear frozen.

Finally, remember that a console app has no application message loop by default. That is fine for a simple blocking MessageBox.Show(), but once the program starts behaving like a real desktop app, it is usually time to use a Windows desktop project type instead of stretching a console app too far.

Summary

  • A .NET console app can show a message box on Windows by referencing WinForms or WPF.
  • For WinForms, target netX.Y-windows, enable UseWindowsForms, and use [STAThread].
  • 'MessageBox.Show() works for simple confirmations and notifications.'
  • This pattern is Windows-specific and not suitable for headless or cross-platform tools.
  • If dialogs become central to the workflow, a desktop app project is usually a better fit.

Related reading
Course
Intermediate
27 lessons
14 hours
OOD Fundamentals

Master object-oriented design from first principles, SOLID, design patterns, and classic interview problems with hands-on coding.

View the course
Track what you have practised

A free account saves your progress, solutions and study plan across every problem on Codemia.

Interview Questions practice on Codemia

Over 8,000 real interview questions from top companies, searchable by company and role.

Browse interview questions

All Rights Reserved.