C# winform程序 使用控制台输出无结果?

C# winform程序 使用控制台输出无结果?

Program代码如下:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
    internal static class Program
    {

        public delegate int NumberAdd(int a, int b);
        /// 
        /// 启动控制台
        /// 
        /// 
        [DllImport("kernel32.dll")]
        public static extern Boolean AllocConsole();

        /// 
        /// 释放控制台
        /// 
        /// 
        [DllImport("kernel32.dll")]
        public static extern Boolean FreeConsole();

        /// 
        /// 应用程序的主入口点。
        /// 
        /// 
        [STAThread]
   
        static void Main(string[] args)
        {
            AllocConsole();//调用系统API,调用控制台窗口
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new WindowsFormsApp1.Form1());
            Console.WriteLine("Hello World!");
            Console.ReadKey();
            FreeConsole();
        }
    }

运行结果如下:

img

没有 FrmMain 类?

别人代码里是这样写的:

Application.Run(new FrmMain());

我找不到FrmMain这个类,所以写的项目自动生成的窗口类。

不支持Action.BeginInvoke(null, null)的委托异步调用方法?

最近在学异步编程,使用 IAsyncResult iAsyncResult = numberAdd.BeginInvoke(2, 5, null, null); 时程序就报错此平台不支持操作,试了一下发现只有..net framework可以运行,而.net winform程序同样报错。想问问以后开发程序也报错怎么办?

img

该回答引用GPTᴼᴾᴱᴺᴬᴵ
关于C# winform程序使用控制台输出无结果的问题,可以尝试在程序运行时调用AllocConsole函数创建控制台窗口,并在需要输出信息的地方使用Console.WriteLine函数进行输出。在代码中,你已经正确地调用了AllocConsole函数并使用Console.WriteLine函数输出了信息,但是由于程序使用了Application.Run函数开启了一个GUI窗口,因此在GUI窗口关闭之前,控制台窗口不会显示任何内容。
·
如果想在程序运行时同时使用GUI窗口和控制台窗口输出信息,可以在GUI窗口关闭之前先关闭控制台窗口,然后再关闭GUI窗口。具体来说,可以在Application.Run函数之前调用AllocConsole函数创建控制台窗口,在Application.Run函数之后使用Console.WriteLine函数输出信息,最后在关闭GUI窗口之前调用FreeConsole函数关闭控制台窗口,代码如下:

static void Main(string[] args)
{
    AllocConsole();//调用系统API,调用控制台窗口
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form mainForm = new WindowsFormsApp1.Form1();
    Application.Run(mainForm);
    Console.WriteLine("Hello World!");
    Console.ReadKey();
    FreeConsole();
}

关于不支持Action.BeginInvoke(null, null)的委托异步调用方法的问题,这是因为Action.BeginInvoke方法是在.NET Framework中引入的,而在.NET Core和.NET 5及更高版本中已被弃用。如果在使用异步编程时需要进行委托的异步调用,可以使用.NET Core和.NET 5及更高版本中提供的Task.Run方法或Task.Factory.StartNew方法代替,代码如下:

Task<int> task = Task.Run(() => numberAdd(2, 5));
int result = await task;

在代码中,Task.Run方法会将委托作为参数传入,返回一个Task对象,然后使用await关键字等待异步操作完成并获取结果。需要注意的是,如果委托中包含的方法有返回值,可以将其改为Func类型的委托,并在使用Task.Run方法时将其作为参数传入。

Console.WriteLine("Hello World!");
这不是你程序中创建的那个控制台

其实你不必调用api,只要把你的项目属性里编译目标设置为控制台即可
或者也可以说,你新建一个控制台类型的程序,用 new Form().Show() 一样可以加载 GUI