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來完成的,進程的全局設置和管理,都應該找它來解決。