I use it if I have some methods I want to use in both a Windows Form and command line application and I don't want to write separate applications or wrappers.
I don't want to make a Console application and start a Windows Form, because the console windows will always be visible. I want a Windows Form application to also work as a Console application with arguments and output.
To do this I had to use the kernel32.dll as shown below:
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool AttachConsole(int processId);
[ DllImport("kernel32.dll", SetLastError = true)]
private static extern bool ReleaseConsole();
DllImport namespace is System.Runtime.InteropServices
AttachConsole(int processID) takes the console process ID to which it will output to, -1 is current.
ReleaseConsole() releases the attached console.
Example:
[STAThread]
static void Main(string[] args)
{
try
{
if (args.Length == 0)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new WindowsTestForm(args));
}
else
{
AttachConsole(-1);
WindowsTestForm testForm= new WindowsTestForm (args);
}
}
catch (Exception)
{
}
finally
{
ReleaseConsole();
}
}
#region Use Console in Windows Forms
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool ReleaseConsole();
#endregion