<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      “Windows原生應用開發早已亂成一團!”

      0
      分享至


      這些年,如果你還在認真考慮“要不要做一個原生 Windows 應用”,大概率會很快陷入一種說不清的困惑。

      一方面,這個平臺看起來從不缺“新東西”:從 Win32、MFC,到 .NET、WPF,再到后來的 UWP、WinUI 3,技術棧不斷演進,概念也越來越現代;另一方面,真正動手做點事情時,卻總會遇到一種強烈的割裂感——新框架不完整,老能力又離不開,開發體驗在“過時”和“半成品”之間反復橫跳。

      更現實的是,就連微軟自己,也在用行動投票:從 Visual Studio Code 到新版 Microsoft Outlook,再到系統里越來越多的界面,本質上都在向 Web 技術靠攏。原生開發,反而成了一種“理論上重要,但實踐中逐漸邊緣化”的選項。

      這也就帶來一個耐人尋味的問題:當一個平臺連自己的核心應用都不再堅定使用“原生方案”時,開發者為什么還要堅持?

      在這篇文章里,一位親自踩過坑的開發者嘗試寫一個再簡單不過的小工具,但正是在這個過程中,他把 Windows 原生開發這些年的斷層、重復和妥協,一層層掀開來看。

      原文鏈接:https://domenic.me/windows-native-dev

      作者 | Domenic Denicola 責編 | 蘇宓

      出品 | CSDN(ID:CSDNnews)

      我是一名 Windows 忠實用戶。《Beginning Visual C++ 6》是我最早接觸的編程書籍之一。這本書的關鍵在于它附帶了一個 Visual C++ 試用版,我十歲的時候就能在家里的電腦上自己裝起來。我還記得 .NET 1.0 發布時,我們正在度假,當時我一邊啃一本 C# 大全,一邊盤算著把自己寫的 Neopets 作弊程序從 MFC 重寫成 Windows Forms。甚至我大學畢業后的第一份工作,也是在一家做 .NET 的公司,只不過我當時負責的是前端開發。

      這些年來,雖然我一直在關注著 Windows 開發生態系統,但職業生涯里其實從來沒真正寫過原生的 Windows 應用。(嚴格來說,Chromium 算是原生應用,但更像是一個自成體系的操作系統。)至于個人項目,Web 一直是更合適的選擇。不過,被童年記憶勾起的一點情懷驅動,我想著寫一個有趣的小型 Windows 工具,當作“退休項目”也不錯。

      結果呢……我可以負責任地說,Windows 原生開發這個生態現在就是一團亂。我完全理解為什么如今幾乎沒人再寫原生 Windows 應用,大家都轉向了 Electron。


      我做了個什么?

      我寫的這個小工具叫 Display Blackout(https://github.com/domenic/display-blackout),主要是解決我自己的一個小需求:

      我用的是三屏顯示器,在打游戲的時候,希望把左右兩塊屏幕“黑掉”。如果直接關掉顯示器,Windows 往往會“抽風”好幾秒,還會把當前所有窗口的位置打亂。但如果是 OLED 屏,只要蓋一層純黑窗口,就等于把像素全關掉,效果其實是一樣的。

      需要說明的是,這并非我的原創想法。我一開始用的是一個叫 AutoHotkey 的腳本(https://github.com/Quorthon13/OLED-Sleeper/blob/eb6eb3e1432c9510899d1aedc345876245adbc72/src/OLED-Sleeper.ahk),寫這篇文章時才發現它已經發展成一個完整的 Windows 應用了。類似的工具在 Microsoft Store 上也能找到。不過,我還是想自己做一個界面更現代一點的小工具——而且本來也不是為了做產品,主要是為了學習。

      從我們的角度來看,這個應用有意思的地方在于,它需要具備這些能力:

      • 列舉當前機器上的所有顯示器及其邊界

      • 創建無邊框、無標題欄、不會搶焦點的純黑窗口

      • 攔截全局快捷鍵

      • (可選)開機自啟動

      • 保存一些持久化設置

      • 在系統托盤里放一個圖標,并帶有簡單菜單

      先把這些需求記住,后面會用到。


      看看我做的這個漂亮的界面。你肯定會同意,它比同類軟件都好。


      Windows 編程簡史

      一開始,Win32 API 是用 C 寫的。不幸的是,這套 API 到今天依然非常重要,包括我這個小工具也離不開它。

      隨著時間推移,在此基礎上出現了一系列抽象層。.NET 之前最主要的是 MFC(一個 C++ 庫),它利用當時算比較“現代”的語言特性,比如類和模板,在原始的 C 函數之上加了一點面向對象的特性。

      真正的“抽象加速列車”,是在 .NET 出現之后才啟動的。

      .NET 有很多層意義,但對我們來說最關鍵的是:它引入了一門新語言 C#,以類似 Java 的方式運行在一個新的虛擬機上(JIT 字節碼)。這帶來了自動內存管理(也就是內存安全),也讓微軟的整個開發生態有了更現代的基礎。

      同時,.NET 還提供了一整套新的 Windows API。UI 方面,.NET 1.0(2002 年)帶來了 Windows Forms,本質上還是對 Win32 窗口和控件 API 的一層封裝,和 MFC 很像。

      到了 .NET 3.0(2006 年),微軟推出了 WPF。這時候不再只是用 C# 對象來創建控件,而是引入了一種獨立的標記語言 XAML,有點像 HTML + JavaScript 的關系。與此同時,這也是他們第一次徹底重寫控件——用 GPU 渲染,而不是簡單封裝系統自帶的 Win32 控件。當時看起來,這像是一個全新的起點,也像是未來 Windows 應用的長期基礎。

      下一次大的轉折點,是 Windows 8(2012 年)發布時引入的 WinRT。它和 .NET 類似,試圖為開發 Windows 應用提供一整套新的 API。如果開發者完全遵循 WinRT 的規則,那么應用就能符合“現代應用”的標準:沙箱化(類似 Android 和 iOS),并且可以同時部署在桌面、平板和手機上。UI 仍然基于 XAML,但相比 WPF 做了不少調整,以適應跨設備的限制環境。

      這個策略在 Windows 10(2015 年)里被“重做”了一次,變成了 UWP。它放松了一些沙箱限制,讓應用能覆蓋桌面 / 手機 / Xbox / HoloLens,同時能力比 WinRT 更強,但仍然達不到 WPF 那種完整 .NET 應用的自由度。與此同時,WinRT / UWP 還帶來一個問題:某些系統級功能(比如推送通知、動態磁貼、Microsoft Store 分發)只開放給這些框架。這導致像 Chrome 或 Microsoft Office 這樣的應用,不得不在舊核心外面套一層 WinRT/UWP 外殼,通過 IPC 等方式通信,架構變得很別扭。

      到了 Windows 11(2021 年),微軟基本放棄了把所有人遷移到“更現代、更沙箱化平臺”的嘗試。Windows App SDK 把原本只屬于 WinRT/UWP 的那些能力開放給所有 Windows 應用——無論是標準 C++(也不再需要 C++/CLI),還是 .NET。這個 SDK 里還包含了 WinUI 3,又一套基于 XAML、完全重寫的 UI 控件庫。

      所以你看懂了嗎?光是 UI 框架這條線,就已經走過了:

      Win32 C APIs → MFC → WinForms → WPF → WinRT XAML → UWP XAML → WinUI 3


      路線分叉

      既然這是個學習項目,我一開始就決定用“最新、最官方”的技術棧,也就是基于 Windows App SDK 的 WinUI 3 應用。

      但具體怎么選,又是一個三選一的問題:

      • C++

      • C#/XAML + “framework-dependent deployment”(依賴系統運行時)

      • C#/XAML + .NET AOT

      這是個很痛苦的選擇。

      用 C++ 可以做出很輕量的應用,運行時只依賴 Windows App SDK,自帶和 Win32 API 的無縫互操作。但在 2026 年,用一個內存不安全的語言從零開始寫新項目,多少有點“逆時代”。

      理想情況是:直接用系統自帶的 .NET,只分發 C# 字節碼,就像 Web 應用共享瀏覽器一樣。這就是所謂的 “framework-dependent deployment”。但問題在于——我完全無法理解的一個決定是:即便是最新的 Windows 11,也只預裝了 .NET 4.8.1,而當前版本已經是 .NET 10。結果就是,只要有一個應用需要新版本 .NET,系統就會彈窗提示用戶去下載運行時。這體驗顯然很糟糕。

      于是只剩下 .NET AOT 這一條路:把整個 .NET 運行時——包括虛擬機、垃圾回收器、標準庫——全部編譯進一個可執行文件。雖然編譯器會盡量裁剪沒用的代碼,但最后一個“只是把屏幕變黑”的小工具,體積也有 9MB。

      (“那 Rust 呢?”你可能會問。微軟周邊社區曾嘗試維護 Windows App SDK 的 Rust 綁定,但后來放棄了。)

      此外,分發方式也一樣讓人頭疼。雖然 Windows 支持傳統的 setup.exe 安裝器(無論手寫還是第三方工具生成),但微軟推薦的“現代方案”是 MSIX——一個帶容器化安裝/卸載能力的包格式。

      問題是,MSIX 非常依賴代碼簽名證書,而這個東西對非美國開發者來說,每年大概要 200–300 美元。沒有簽名的話,側載體驗極其糟糕:需要在管理員 PowerShell 里輸入一長串晦澀命令。

      你可能會想,那直接上 Microsoft Store 不就好了?不好意思,我試了——被拒了,理由是“沒有提供獨特且持久的價值”。

      最讓人難受的是,這一切其實都不是技術上做不到,而是完全可以更簡單:

      • .NET 本可以通過 Windows Update 分發,讓系統始終保持最新版本,這樣 framework-dependent deployment 就能成立

      • 至少也可以提供一個 MSIX 版的 .NET,讓其他 MSIX 應用聲明依賴

      • 未簽名 MSIX 本可以像 EXE 一樣使用基于用戶反饋的信譽系統

      • Windows 的代碼簽名證書,本可以像 Apple 生態那樣只要 100 美元/年,而不是 200+

      但現實是——就像現在的 Windows 開發體驗一樣,這些東西都只做到一半,處處透著一種“差點意思”。


      被“遺落”的能力

      事實證明,每隔幾年就把操作系統和 UI API 重造一遍,是一件非常耗費精力的事情。再加上中途不斷嘗試做沙箱化、限制那些“過于強大”的能力,結果就是:每一層新框架都會留下缺口——一些在舊框架里能做的事情,在新框架里反而做不了了。

      這其實不是什么新問題。早在 MFC 時代,你就經常不得不回退去直接調用 Win32 API;而 .NET 從 1.0 開始就有 P/Invoke 這種“逃生通道”。所以,從某種角度看,既然微軟現在也不再強制你必須只用最新框架才能獲得新能力,那么偶爾往下層調用也不算世界末日。

      但問題在于,這很讓人挫敗:如果一半的代碼都只是用來做 interop、去調用那些老舊的 API,那用微軟最新最好的技術還有什么意義?如果最后還是要去封裝一堆 C API,那用 C# 編程又有什么意義?

      讓我們重新審視一下我的應用程序需要完成的任務列表,對照一下 Windows App SDK 實際能做什么:

      • 枚舉顯示器及其邊界:可以做到,但你得用 for 循環,不能用 foreach。而如果想監聽顯示器變化,就必須用 P/Invoke,因為現代 API 根本不好用。

      • 創建無邊框、無標題欄、不會搶焦點的黑色窗口:大部分可以實現,但“不會搶焦點”這一點,還是得靠 P/Invoke。

      • 攔截全局快捷鍵:不行,必須 P/Invoke。

      • 開機自啟動(可選):這個可以,而且還提供了一個和系統設置集成、默認關閉的現代 API,算是做得不錯。

      • 持久化存儲設置:可以做到。

      • 顯示帶有少量菜單項的托盤圖標:完全沒有實現。托盤圖標本身要靠 P/Invoke;更麻煩的是,托盤菜單并沒有統一標準——你選不同的第三方封裝庫,最后出來的右鍵菜單風格都不一樣。


      Windows IME 系統組件采用現代磨砂玻璃風格,與一些其他系統組件相匹配,但我找不到任何應用程序(包括 Microsoft 應用程序)與之匹配。

      總結下來就是:看起來是“現代框架”,但很多關鍵能力不是缺失,就是半殘,最后還是繞回老 API。

      但這些還只是“顯眼的問題”。甚至連一個很基礎的功能——根據內容自動調整窗口大小——也在從 WPF 走到 WinUI 3 的過程中,不知什么時候被弄丟了。

      更麻煩的是,既然你經常需要回退調用 Win32 C API,那么 interop 本身也在“換代”,事情就更復雜了。

      現在所謂的“現代方案”是一個叫 CsWin32 的東西,目標是降低 P/Invoke 的痛苦。但它連結構體里的字符串都沒法正確封裝。在我看來,這就是那種長期停留在 1.0 之前、資金和投入都不足、更新記錄也毫無亮點的項目——大概率再過幾年就會被放棄。

      而且,CsWin32 的問題不只是實現不完整,有些甚至源于 C# 語言本身的缺陷。官方文檔里有一段讓人哭笑不得的說明:

      Win32 中有些參數是 [optional, out] 或 [optional, in, out]。C# 沒有符合習慣的方式來表達這種概念,因此對于包含這類參數的方法,CsWin32 會生成兩個版本:一個包含所有 ref/out 參數,另一個則全部省略。

      也就是說,C# 連 Win32 API 里一個非常基礎的參數類型都表達不了?這不過是現有兩種參數語義的組合而已。

      按理說,既然微軟完全掌控 C#,那它應該是一個圍繞 Windows API 精心打磨、協同演進的語言。但現實顯然不是這樣。

      實際上,不只是調用老的 Win32 API 時 C# 顯得力不從心,就連面對自身平臺需求,它也沒跟上。

      2006 年 WPF 剛推出時,大力強調“雙向數據綁定”,大家很快就發現:為了讓一個類能綁定到 UI,需要寫大量樣板代碼,根本不可持續。基本上,每個屬性都要寫成 getter/setter,對 setter 做“值未變化則跳過”的判斷,還要手動觸發事件。(而在 C# 里,觸發事件本身就很啰嗦。)后來大家嘗試過各種“補丁式”的方案,比如基類、代碼生成器等等。但真正的解決辦法,其實應該是語言層面的支持——就像 JavaScript 通過 decorators 和 proxy 做到的那樣。

      結果呢?

      當我這次自己動手寫應用時,驚訝地發現:WPF 發布 20 年之后,這些樣板代碼幾乎沒怎么變。(唯一的改進,是 C# 允許在觸發事件時省略屬性名。)

      這不禁讓人想問:這二十年來,C# 語言團隊到底在忙什么?為什么“原生可觀察類”這種需求從來沒被優先解決?


      總結

      說實話,我感覺微軟對原生 Windows 應用開發這件事根本就不重視。

      相關的 issue 追蹤里,到處都是開發者遇到各種痛苦的 bug 和功能缺失,但微軟工程師的回應寥寥無幾。大多數的 Windows App SDK 更新日志也都是在新增機器學習 API。

      而更諷刺的是,從 Visual Studio Code、Outlook,到甚至 Windows 開始菜單本身,很多微軟自家的應用,都是用 Web 技術寫的。

      這或許也是為什么社區里很大一部分人選擇“另起爐灶”,轉向第三方 UI 框架,比如 Avalonia 和 Uno Platform。從它們的官網和 GitHub 倉庫來看,這些項目維護得更好,也更像是由一群真正熱愛 WPF、但希望 WinUI 能更強大的人在推動。同時,它們也擁抱跨平臺,這在不少場景下確實很重要。

      但說到這里,很多人會好奇地直接問一句:那為什么不干脆用 Electron 呢?

      說真的,C# 和 XAML 并沒有比 TypeScript / React / CSS 強到哪里去。就像我上文列出的那份需求列表所展示的,只要稍微超出基礎功能,你最終還是得用到 Win32 互操作。如果你使用的是像 Tauri 這樣的框架,甚至都不用打包整個 Chromium 二進制文件,其實只用系統自帶的 WebView 就夠了。然而,這個系統自帶的 WebView 每 4 周(甚至很快變成 2 周)就更新一次,而系統自帶的 .NET 卻永遠停在 4.8.1 版本。

      當然,微軟也不是完全沒機會扭轉局面。

      Windows App SDK 至少比當年繞進 WinRT / UWP 那一大圈要更靠譜一些。前面提到的打包和分發問題,其實也有不少“低垂的果實”可以改進。另外,他們最近也提到要提升 Windows 的整體質量,并且計劃在系統內部更多使用 WinUI 3——理論上,這可能會反過來推動 WinUI 本身的完善。

      不過,我并不抱太大期待。從目前的情況看,大多數開發者也持相同的態度。

      Hacker News 上的人總愛感嘆“原生應用的消亡”,但考慮到 Windows 應用平臺如今的混亂程度,我寧可每天用 Web 技術棧,再用 Electron 或 Tauri 去橋接必要的 Win32 能力。

      110 萬美金懸賞!

      AMD 2026 線上黑客松大賽來襲

      從 MXFP4 MoE 算子爆改,到真實千倍并發下的吞吐量極限拉扯

      不看資歷,只看絕對速度

      挑戰DeepSeek?R1/KimiK2.5極致并發

      入圍即能拿 1 萬美金

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      恭喜!官方確認東契奇坎寧安申訴成功獲評獎資格 華子申訴被駁回

      恭喜!官方確認東契奇坎寧安申訴成功獲評獎資格 華子申訴被駁回

      醉臥浮生
      2026-04-17 00:00:52
      傳熱提升80%!中國突破芯片“熱墻”,或擺脫進口依賴

      傳熱提升80%!中國突破芯片“熱墻”,或擺脫進口依賴

      觀察者網
      2026-04-17 10:04:05
      汪峰真是不懂珍惜,這么高級的美人不應該拱手讓出去。

      汪峰真是不懂珍惜,這么高級的美人不應該拱手讓出去。

      手工制作阿殲
      2026-04-16 20:06:01
      比利時一男子在云南哈巴雪山失聯超20天 當地多次搜救無果 知情人士:仍在“盲搜”

      比利時一男子在云南哈巴雪山失聯超20天 當地多次搜救無果 知情人士:仍在“盲搜”

      極目新聞
      2026-04-17 13:46:08
      年輕人不買房不結婚了:就怪那個把房婚捆綁的人

      年輕人不買房不結婚了:就怪那個把房婚捆綁的人

      三言四拍
      2026-04-16 16:29:36
      國民黨的創始人——不是孫中山,而是宋教仁,宋教仁是誰?

      國民黨的創始人——不是孫中山,而是宋教仁,宋教仁是誰?

      小莜讀史
      2026-04-14 19:44:08
      小米會產10萬元以內的汽車嗎?雷軍坐在新SU7上回應:10年以內很難做到

      小米會產10萬元以內的汽車嗎?雷軍坐在新SU7上回應:10年以內很難做到

      極目新聞
      2026-04-17 10:34:14
      武大楊某媛曬工作照被認出!改名換姓被揭穿,品牌連夜切割跑路

      武大楊某媛曬工作照被認出!改名換姓被揭穿,品牌連夜切割跑路

      奇思妙想草葉君
      2026-04-17 01:45:38
      老照片太刺眼:王寶強當年真沒察覺嗎

      老照片太刺眼:王寶強當年真沒察覺嗎

      草莓解說體育
      2026-04-16 20:07:54
      鬧大!攝影師被驅趕后續:原因不簡單,整個大連受影響,通報已出

      鬧大!攝影師被驅趕后續:原因不簡單,整個大連受影響,通報已出

      奇思妙想草葉君
      2026-04-17 04:18:50
      廣州公布一起4死2傷爆燃事故調查報告:審計發現謊報,提出處理建議

      廣州公布一起4死2傷爆燃事故調查報告:審計發現謊報,提出處理建議

      上游新聞
      2026-04-17 12:02:03
      香港演員潘宏彬去世,終年63歲

      香港演員潘宏彬去世,終年63歲

      魯中晨報
      2026-04-17 09:20:05
      78歲蔡志忠:每天要畫800張畫,一場直播能賣100多萬元,“我過了普通人十輩子的人生”

      78歲蔡志忠:每天要畫800張畫,一場直播能賣100多萬元,“我過了普通人十輩子的人生”

      澎湃新聞
      2026-04-17 10:54:06
      終于妥協認輸 稱無條件交出全部濃縮鈾:早知今日何必當初?

      終于妥協認輸 稱無條件交出全部濃縮鈾:早知今日何必當初?

      聚峰軍評
      2026-04-17 12:07:36
      新疆新設草湖市

      新疆新設草湖市

      新京報
      2026-04-17 12:30:35
      不可思議!蒙古國三百萬人去年生了8萬,內蒙兩千多萬人才生了10萬

      不可思議!蒙古國三百萬人去年生了8萬,內蒙兩千多萬人才生了10萬

      西游日記
      2026-04-16 20:53:41
      日本一父親殺害兒子并遺棄山林?!其被捕后說的一句話,讓全網震怒...

      日本一父親殺害兒子并遺棄山林?!其被捕后說的一句話,讓全網震怒...

      今日日本
      2026-04-17 11:46:02
      李楠正式結束3年禁賽期:可回場邊輔佐許利民 本季北京主帥不會變

      李楠正式結束3年禁賽期:可回場邊輔佐許利民 本季北京主帥不會變

      醉臥浮生
      2026-04-16 22:27:06
      特寫:蘇林的十小時中國高鐵深度體驗

      特寫:蘇林的十小時中國高鐵深度體驗

      澎湃新聞
      2026-04-17 08:57:38
      寶馬在用AI把“德系嚴謹”變成“數字秩序”

      寶馬在用AI把“德系嚴謹”變成“數字秩序”

      汽車投訴網
      2026-04-17 11:24:42
      2026-04-17 14:20:49
      CSDN incentive-icons
      CSDN
      成就一億技術人
      26459文章數 242270關注度
      往期回顧 全部

      科技要聞

      Anthropic推出Opus 4.7,坦言依不及Mythos

      頭條要聞

      特朗普強推后被迫對黎巴嫩停火 以色列被指成"犧牲品"

      頭條要聞

      特朗普強推后被迫對黎巴嫩停火 以色列被指成"犧牲品"

      體育要聞

      贏下快船,這場很庫里,很格林,很科爾

      娛樂要聞

      劉德華摯友潘宏彬離世 曾一起租房住

      財經要聞

      海爾與醫美女王互撕 換血抗衰誰的生意?

      汽車要聞

      又快又穩的開掛動力! 阿維塔06T全系搭分布式電驅

      態度原創

      旅游
      本地
      時尚
      公開課
      軍事航空

      旅游要聞

      美到失語!20年才開一大叢的崖壁“奇葩”,開花了

      本地新聞

      12噸巧克力有難,全網化身超級偵探添亂

      假期,怎么拍照最出片?

      公開課

      李玫瑾:為什么性格比能力更重要?

      軍事要聞

      美宣布黎以停火10天 以方稱不會撤軍

      無障礙瀏覽 進入關懷版