首页 > 编程语言 >WinForm(一):开始一个WinForm程序

WinForm(一):开始一个WinForm程序

时间:2022-12-10 10:33:57浏览次数:37  
标签:STAThread 开始 程序 Application 线程 Main COM WinForm

  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来完成的,进程的全局设置和管理,都应该找它来解决。

  想要更快更方便的了解相关知识,可以关注微信公众号 

 

 

标签:STAThread,开始,程序,Application,线程,Main,COM,WinForm
From: https://www.cnblogs.com/axzxs2001/p/16970896.html

相关文章

  • WinForm(一):开始一个WinForm程序
    WinForm程序只能运行在Windows上,即使是基于.NET5,6,7也一样。因为WinForm的UI层对接的底层API是基于Windows的。用VisualStudio创建一个WinForm应用很简单,建议使用非......
  • gpu 打满bot 程序
    importtorchimporttimeimportosimportargparseimportshutilimportsysdefparse_args():parser=argparse.ArgumentParser(description='Matrixmulti......
  • 51单片机-案例程序源码-笔记
    最近整了块单片机,这里分享一下源码,供师兄弟们一起学习研究。如果会c语言的话,可能觉得这些代码实在是太简单了,而且不够优雅......
  • 微信小程序的学生选课系统设计与实现的源码+文档
    摘 要网络的广泛应用给生活带来了十分的便利。所以把学生选课管理与现在网络相结合,利用java技术建设微信小程序的学生选课系统,实现学生选课的信息化。则对于进一步提高学......
  • 新冠疫苗预约小程序设计与实现的源码+文档
    摘 要网络的广泛应用给生活带来了十分的便利。所以把新冠疫苗预约管理与现在网络相结合,利用java技术建设新冠疫苗预约小程序,实现新冠疫苗预约的信息化。则对于进一步提高......
  • 微信小程序的驾校预约管理系统设计与实现的源码+文档
    摘要在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括微信小程序的驾校预约管理系统的网络应用,在外国微信小程序的驾校预约管理系统已经是很普遍......
  • Android 装载器---在应用程序中使用装载器
    这一节描述了在Android应用程序中如何使用装载器,使用装载器的应用程序通常包括以下内容:1.一个Activity或Fragment;2.一个LoaderManager实例;3.一个用于加载通过Conte......
  • 创建第一个Quarkus程序
    Quarkus提供了QuarkusCLI供命令行操作。同时支持Maven和Gradle构建工具。可以通过https://code.quarkus.io/网页创建Quarkus项目。quarkus版本是2.14.2.Final,java版本是op......
  • 01-JavaSE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行
    01-JavaSE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行Java的发展历史Java是一种面向对象的程序设计语言,由SunMicrosystems公司的JamesGosling等人于......
  • IIS 运行.net core程序时遇到的问题总结
    1、权限问题解决:新增IIS默认用户IIS_USERS2、问题:Mvc错误解决:安装2个包(网上资源自己找)3、问题:web.config解决1:可能是url地址重写的问题,把配置文件内这一段注释......