当前位置:网站首页>WinForm(一):开始一个WinForm程序
WinForm(一):开始一个WinForm程序
2022-07-30 06:05:00 【dotNET跨平台】
WinForm程序只能运行在Windows上,即使是基于.NET5,6,7也一样。因为WinForm的UI层对接的底层API是基于Windows的。
用VisualStudio创建一个WinForm应用很简单,建议使用非.NET Framework版,因为.NET Framework微软渐渐不支持了,即使出了bug。

本篇分享两个技术点,STAThreadAttribute和Application。
STAThreadAttribute
WinForm肯定是遵守从Main入口的,程序结构典型的C#程序的层次结构:命名空间->类型->方法
namespace WinFormDemo01
{
internal static class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
}不一样的是[STAThread],这个特性在Main函数上面,也只有在这里会起作用。它完整写法是STAThreadAttribute,指示应用程序的 COM 线程模型是单线程单元 (STA)。
注:
COM( Component Object Model)组件对象模型 :定义了一个二进制互操作性标准,用于创建在运行时交互的可重用软件库。
Aparment叫套间:是线程模型概念的一个继承者,实现是一个结构而已。如查一个套间是STA,那么这个套间有且只有一个线程和其关联。
Single-threaded Apartments单线程套间:是COM提供的线程模型之一。
如果不声明STAThread会出现什么情况呢?假如在Form1上放一个按钮,按钮单击后执行下面的代码:
this.Text=(string?)Clipboard.GetDataObject()?.GetData(DataFormats.Text);不声明STAThread就会报一个ThreadStateException类型的异常,Message是“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记”。因为剪切板是系统的,需要通过COM协议来访问,如果应用不是STA的,会限制对其访问。
Application
Main方法里有Application对象,这里可以看作是一个程序,或一个进程序,代表当前程序,第一行是配置的初始化,这个方法也是近期提升成一个方法,方法里是对WinForm可视化,应用渲染,高DPI的一些配置。第二行就是启动就用了,Run里的窗体就是主窗体,如果关闭主窗体程序会退出,或者调用Application.Exit(),应用也会退出。
Application,代表应用,它可以全局设置一些程序的信息,订阅一些应用的事件,比如主线程退出,应用退出,全局异常捕获等。同时还提供了一些方法,比如应用重启,和各种全局设置方法。

本篇只是简单介绍了两个技术点,一个是WinForm启动时,通过在Main方法添加特性STAThread来声明这是一个COM线程模型是单线程单元;另一个知识点是整个WinForm进程的管理是通过Application来完成的,进程的全局设置和管理,都应该找它来解决。
边栏推荐
- golang: Gorm配置Mysql多数据源
- this与super
- C# 获取系统已安装的.NET版本
- go : use gorm to modify data
- go : go gin returns JSON data
- Input method for programmers
- A magical no main method of code
- Equation Derivation Proof of Vector Triple Product
- What happens when @Bean and @Component are used on the same class?
- The first artificial intelligence safety competition officially launched
猜你喜欢

How does Redis prevent oversold and inventory deduction operations?

入选“十大硬核科技”,详解可信密态计算(TECC)技术点

UDP和TCP使用同一个端口,可行吗?

AI可通过X光片识别种族,但没人知道为什么

预测人们对你的第一印象,“AI颜狗”的诞生

从 Google 离职,前Go 语言负责人跳槽小公司

Equation Derivation Proof of Vector Triple Product

Is it possible to use the same port for UDP and TCP?

Ali two sides: List several tips for Api interface optimization

【MySQL】MySQL中如何实现分页操作
随机推荐
AI can identify race from X-rays, but no one knows why
The first artificial intelligence safety competition officially launched
Electron日常学习笔记
预测人们对你的第一印象,“AI颜狗”的诞生
Upload file -- file type, picture type, document type, video type, compressed package type
Redis 如何实现防止超卖和库存扣减操作?
IDEA 中CheckStyle安装及使用
一段神奇的没有主方法的代码
Electron使用romote报错 : Uncaught TypeError: Cannot read property ‘BrowserWindow‘ of undefined
export , export default, import complete usage
专访蚂蚁:这群技术排头兵,如何做好底层开发这件事?| 卓越技术团队访谈录
IDEA搜索插件无结果一直转圈圈的解决办法
Ali: How many methods are there for multi-threaded sequential operation?
go : use gorm to modify data
MySQL basics [naming convention]
go : go-redis list操作
【day5】数组
适合程序员的输入法
When does MySQL use table locks and when does it use row locks?
Graphical relational database design ideas, this is too vivid