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();
}
}
运行结果如下:
别人代码里是这样写的:
Application.Run(new FrmMain());
我找不到FrmMain这个类,所以写的项目自动生成的窗口类。
最近在学异步编程,使用 IAsyncResult iAsyncResult = numberAdd.BeginInvoke(2, 5, null, null); 时程序就报错此平台不支持操作,试了一下发现只有..net framework可以运行,而.net winform程序同样报错。想问问以后开发程序也报错怎么办?
该回答引用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