)
1. 先想清楚你是真需要老版本還是只需要老工具鏈干這行久了你會發(fā)現(xiàn)凡是搜老版本Visual Studio安裝方法的人十有八九不是沖著IDE界面的情懷去的而是被某個跑不起來的遺留項目逼到這兒的。我上個月就幫人處理過一起某項目用了C/MFC改寫的老代碼編譯環(huán)境鎖死在VS2015升級到新版本之后界面控件全亂70多個子模塊的工程配置一升級就崩。最后沒辦法只能老老實實裝回VS2015。類似場景在制造業(yè)、醫(yī)療設(shè)備、工控領(lǐng)域特別常見供應(yīng)商給的SDK和示例代碼經(jīng)常是七八年前寫的編譯器和平臺工具集被焊死在老版本上。但在動手裝之前我要先潑一盆冷水裝老版本VS和裝老版本工具鏈是兩個完全不同的問題。很多人以為必須完整安裝一個舊版IDE其實他們要的僅僅是老版本的MSVC編譯器、頭和庫文件。比如VS2013對應(yīng)的v120工具集VS2015對應(yīng)的v140工具集。從VS2017開始微軟已經(jīng)允許在最新版IDE里直接借用舊工具集——只要你在同一臺機器上裝了對應(yīng)的老版本新IDE打開項目后把項目屬性里的平臺工具集從v143改成v120或v140就能用老編譯器編譯界面體驗還是新的。如果你是這種情況那這篇文章對你的幫助會打個折扣因為你的解法是裝好老工具集再指給新IDE用我在最后一章會專門講。但如果你的場景屬于下面任一類那你就是文章標題鎖定的目標用戶一是項目里使用了老版本特有的功能比如老MFC類庫、ATL向?qū)А⒗习鎴D形界面框架新IDE沒有對應(yīng)向?qū)е亟üこ痰墓ぷ髁勘妊b老版大得多二是項目依賴的第三方組件商明確要求使用指定版本開發(fā)環(huán)境簽名校驗和證書鏈都有講究三是團隊用的構(gòu)建服務(wù)器還在跑Windows 7或老系統(tǒng)新IDE根本不支持那些操作系統(tǒng)四是公司內(nèi)網(wǎng)的資料、培訓文檔、自動化腳本全是圍繞老版本寫的換IDE意味著全盤返工。一句話這需求不是因為懶是因為江湖規(guī)矩沒散。認清自己屬于要工具集還是要完整IDE那類后續(xù)的步驟完全不同這決定你接下來是去翻ISO鏡像還是去跑一條layout命令。2. 官方渠道的來路梳理在線引導器、ISO鏡像和各版本差異先聊一個反直覺的事實Visual Studio從2017版開始我們下載到的那個安裝程序根本不是安裝包本尊。它只是一個幾MB的引導器真正的組件都是安裝時從官方服務(wù)器現(xiàn)場拉的。所以2017之后的版本理論上只要引導器還在任何時候都能安裝老版本——官方下載中心至今還掛著2017、2019的引導器只是默認展示位置比較靠后。但2015及以前的版本情況就麻煩得多需要分代差來談。我在下面這個表里整理了幾類典型版本對應(yīng)的安裝介質(zhì)類型看完你就明白為什么2015之前的安裝方式會被討論得這么多版本引導器/介質(zhì)形式是否支持離線layout產(chǎn)品密鑰要求VS 2017 / 2019在線引導器exe幾MB支持/layout企業(yè)版/專業(yè)版需密鑰社區(qū)版免密VS 2015帶引導邏輯的小型exe支持/Layout企業(yè)版/專業(yè)版需密鑰Express免費VS 2013Web安裝器setup.exe不支持專業(yè)版及以上需密鑰VS 2012Web安裝器setup.exe不支持專業(yè)版及以上需密鑰VS 2010Web安裝器 完整DVD ISO不支持有ISO需要產(chǎn)品密鑰VS 2008 / 2005完整DVD ISO不支持有ISO需要產(chǎn)品密鑰拿VS2015舉例當年官方提供的是一個叫vs_enterprise_xxx.exe的文件體積大概在1.5MB左右。你雙擊它它會在后臺先把.NET Framework、VC運行庫這些基礎(chǔ)組件拉下來再開始主體的安裝。如果中間網(wǎng)絡(luò)閃斷它不會斷點續(xù)傳而是整段重來。這也是為什么我強烈建議2015及以后版本的安裝優(yōu)先做離線包后面第三章我會給完整步驟。至于2013和更老的版本情況更直接官方當年發(fā)的是Web安裝器和完整DVD鏡像兩種介質(zhì)。Web安裝器基本沒救——它依賴的老下載通道很多已經(jīng)停服跑起來經(jīng)??ㄔ谡跈z查更新的組件上半小時不動。正確的路線是找到對應(yīng)的完整ISO鏡像文件。ISO里的Setup.exe不依賴網(wǎng)絡(luò)組件齊備本質(zhì)是MSI包體系離線環(huán)境下完全可用。那ISO去哪找這里我只講合規(guī)的路徑第一官方下載中心最底部的歷史版本/其他版本入口能拿到部分老版本安裝引導器和工具集第二如果你有訂閱賬戶訂閱者下載站保留了相當長時間段的歷史鏡像按版本號和發(fā)布語言檢索即可第三批量許可客戶在對應(yīng)的批量許可服務(wù)中心能下載帶協(xié)議的鏡像。市面上流傳的第三方鏡像不是不能碰但你沒法驗證里面的文件是否被替換過生產(chǎn)環(huán)境裝完出了問題排查成本遠高于你省下的那點時間。最后再說一個密鑰問題。VS2010、VS2015這類老版本的試用期階梯設(shè)計是安裝向?qū)г试S你先跳過密鑰直接裝試用版裝完后幾天內(nèi)必須在賬戶設(shè)置里完成產(chǎn)品密鑰激活。但注意從VS2015開始安裝器要求密鑰的階段提前了——專業(yè)版/企業(yè)版如果拿不到密鑰連完整安裝流程都進不去。社區(qū)版和Express版是免費授權(quán)不需要密鑰的這也是很多個人開發(fā)者和學習場景優(yōu)先選它們的原因。3. 引導器的工作原理與離線安裝包制作layout命令的完整實操聊完了渠道這一章進入技術(shù)核心2015及之后的版本怎么把在線安裝變成一次成功的離線安裝。先說說為什么這套機制值得理解。微軟從VS2017起用了一套引導器通道的架構(gòu)。引導器exe本身只負責兩件事校驗自身數(shù)字簽名、向官方通道請求組件清單。組件清單是XML描述文件里面寫了該版本需要哪些工作負載、組件、依賴關(guān)系相當于一份購物清單。引導器拿到清單后再到指定的內(nèi)容分發(fā)節(jié)點下載對應(yīng)的cab包。這種設(shè)計的好處是安裝和更新共享同一套緩存壞處是它對網(wǎng)絡(luò)線路的穩(wěn)定性要求極高——一旦某幾個cab包下載失敗后續(xù)安裝必然報錯。所謂離線安裝包本質(zhì)就是用一條命令把這份購物清單里所有的cab包提前下載到本地目錄安裝時引導器發(fā)現(xiàn)本地清單完整就不再訪問外網(wǎng)。這個操作官方叫創(chuàng)建布局命令非常直接。我以VS2015為例給出一個可以照著抄的流程。首先去官方渠道把vs_enterprise.exe引導器下載到一臺聯(lián)網(wǎng)的Windows機器上然后打開管理員權(quán)限的命令提示符執(zhí)行vs_enterprise.exe /Layout D:\vs2015_offline /Language en-US,zh-CN注意這里用的是斜杠開頭的/Layout這是VS2015及更早版本的語法。程序會進入下載模式屏幕上會顯示一個進度條和所需磁盤空間。VS2015全量布局大約需要5到8GB視你選擇的語言和組件而定建議D盤預(yù)留15GB以上因為布局目錄同時扮演著安裝緩存的角色。VS2017和2019的語法變成了雙橫線命令風格也更現(xiàn)代化。比如創(chuàng)建僅包含C桌面開發(fā)的VS2019離線布局vs_enterprise.exe --layout D:\vs2019_offline --add Microsoft.VisualStudio.Workload.NativeDesktop --includeRecommended --lang zh-CN en-US參數(shù)的含義分別是--layout指定布局目錄--add明確要包含的工作負載--includeRecommended把該工作負載推薦的組件一并拉下來--lang限定語言。如果你不確定需要哪些工作負載最省事的做法是不加--add讓它把全部組件都下載——前提是你磁盤夠大VS2019全量布局輕松超過30GB。實際使用中我更推薦精確指定裝的時候也能少點排隊時間。布局下載完之后那個目錄里會生成一個setup.exe雙擊它執(zhí)行的就是完全離線安裝。離線的判斷標準很簡單拔網(wǎng)線后安裝照樣能走下去就是成功。不想拔網(wǎng)線的話也可以在安裝時觀察任務(wù)管理器里有沒有到外網(wǎng)的連接。這里藏著一個特別容易踩的坑我單獨拎出來講。老版引導器在2015年發(fā)布時默認走的是當時主流的TLS 1.0/1.2加密鏈路。而Windows 10以上的系統(tǒng)出于安全考慮默認把TLS 1.0和1.1關(guān)掉了。于是很多人的引導器雙擊后根本不進入下載流程直接彈網(wǎng)絡(luò)錯誤。解決辦法是臨時在Internet選項 → 高級 → 安全里勾選使用TLS 1.0/TLS 1.1等布局下載完再取消勾選。我用這個辦法救回過好幾次VS2015的布局任務(wù)比反復(fù)重試網(wǎng)絡(luò)實在得多。但也要說清楚這只影響老引導器的聯(lián)網(wǎng)階段離線安裝階段不受影響所以臨時開一下沒有安全問題。另外還有一個小技巧布局目錄里保留了下載過程的臨時文件如果你看到某個cab文件體積為零字節(jié)或極小八成是那次網(wǎng)絡(luò)中斷留下了殘缺文件。刪掉整個布局目錄重新執(zhí)行一遍通常比逐個文件補下載更快——因為下載器不會校驗已存在的文件它只會看到文件還在就跳過結(jié)果裝的時候又報壞包。實踐經(jīng)驗告訴我與其賭它重下不如狠下心來清空重來磁盤時間換網(wǎng)絡(luò)焦慮值得。4. 新舊系統(tǒng)兼容性裝之前必須補的三件準備這一章寫給那些在Windows 10/11上裝老版本的人。很多人ISO掛載好、雙擊setup.exe結(jié)果提示此程序可能安裝不正確或者干脆沒反應(yīng)然后就開始懷疑鏡像有問題。根據(jù)我的經(jīng)驗八成不是鏡像的問題是缺了三件準備工作。第一件老版本Visual Studio依賴的.NET Framework沒有啟用。Windows的啟用或關(guān)閉Windows功能面板里.NET Framework 3.5包含2.0和3.0默認是關(guān)閉的。VS2008需要它VS2010需要.NET 4.xVS2012和VS2013也依賴相應(yīng)的.NET版本?,F(xiàn)在Win10/11自帶的.NET Framework最高到4.8但并不代表老版本的客戶端配置文件組件齊全。你可以在安裝VS前先去控制面板勾選.NET Framework 3.5包括2.0和3.0讓它在線下載補全。這一步能攔下很多安裝器前置檢查失敗的報錯。如果你是內(nèi)網(wǎng)離線環(huán)境需要預(yù)先準備好對應(yīng)的.NET安裝包在系統(tǒng)組件列表里選從備用源安裝。第二件系統(tǒng)自帶的安全機制往往會攔下老版安裝器。舊版setup.exe因為發(fā)布年份早沒有新版代碼簽名時間戳或者簽名的證書鏈在老機器上沒問題但在新系統(tǒng)驗證時缺了中間證書。于是屏幕右下角彈藍色提示說明Windows Defender SmartScreen已經(jīng)阻止了它。這不是病毒提示是簽名信任鏈的問題。處理方式有兩種一是右鍵安裝程序選擇屬性→常規(guī)頁簽里勾選解除鎖定再去執(zhí)行二是在SmartScreen彈窗里點擊更多信息→仍然運行。如果你是從ISO掛載的虛擬光驅(qū)里雙擊運行的很多時候連解除鎖定都沒有要先把整個ISO里的文件復(fù)制到本地磁盤再右鍵屬性解除鎖定這個細節(jié)很多人沒注意。第三件提前裝好對應(yīng)的VC運行庫。老版本VS安裝過程會順便裝一份對應(yīng)版本的Microsoft Visual C Redistributable但如果你的系統(tǒng)之前裝過新版本運行庫舊版本的安裝程序有時會誤判為已存在而跳過高版本覆蓋邏輯導致后續(xù)裝出來的VS某些組件運行時報找不到MSVCR120.dll之類。穩(wěn)妥的做法是去官方下載站把VC2010、VC2013、VC2015-2019對應(yīng)的x64/x86運行庫離線包先裝好再動VS。順序反了也不致命但會多出很多莫名其妙的運行時問題。再說一個Windows 11特殊的地方。老版本安裝器在Windows 11上跑偶爾會卡在正在準備安裝目錄階段很久。這是因為老安裝器執(zhí)行時的臨時解壓目錄需要向C盤根目錄的ProgramData寫入大量小文件Windows Defender實時掃描會對每個文件逐一過檢文件一多就變成了一場拉鋸戰(zhàn)。你可以在安裝前把Windows Defender的實時保護臨時關(guān)掉或者至少把VS相關(guān)目錄加進排除列表。裝完記得恢復(fù)保護別為省幾分鐘把自己暴露在風險里。我還見過有人直接給C盤臨時文件路徑下的舊安裝程序緩存分配了極少空間導致解壓失敗——這屬于系統(tǒng)維護習慣問題建議查一下C盤剩余空間至少保留20GB再開始。如果你裝的是VS2010及更早還會遇到系統(tǒng)版本檢測不通過的硬攔截安裝器拿到系統(tǒng)版本號后發(fā)現(xiàn)比它支持的Windows 7新很多直接拒絕。這種情況官方?jīng)]有正式兼容聲明實踐中常見的做法是右鍵setup.exe選擇兼容性疑難解答或者手動指定兼容模式為Windows 7/Windows XPService Pack 3。裝完后的IDE運行也可能需要同樣設(shè)置。注意這屬于灰色地帶別指望它100%穩(wěn)定但在我測試過的多個場景里VS2010在Windows 10下用兼容模式裝完日常編譯調(diào)試是能用的問題集中在幫助系統(tǒng)和個別網(wǎng)頁相關(guān)組件上。5. 裝到一半失敗怎么辦日志位置、常見錯誤碼和殘留清理套路這一章是壓艙石因為老版本安裝翻車率真的不低。做技術(shù)支持這么多年我總結(jié)出一條鐵律先看日志再動手別在沒證據(jù)的情況下重裝。老版本VS的安裝日志位置比較散我按版本整理了版本日志文件位置VS 2015%temp%\dd_*.log以dd_開頭的文件VS 2017%temp%\dd_*.log 加 %ProgramData%\Microsoft\VisualStudio\Packages_Installer 下的日志VS 2013及更早%temp%\dd_setup_*.txt個別組件看C:\Windows\Temp下的MSI日志打開日志后重點搜索兩樣東西一是Error或Failed關(guān)鍵字二是組件名稱后面跟著的十六進制錯誤碼。常見錯誤碼我遇到過這些列個對照表方便你診斷錯誤碼常見含義處理方向0x80070643安裝程序部署失敗多為MSI損壞到控制面板先卸載殘留的對應(yīng)版本項再重裝0x800F081F.NET組件源不可用到系統(tǒng)功能面板補裝.NET 3.5用備用源0x80070005拒絕訪問權(quán)限不足確保安裝全程以管理員權(quán)限運行關(guān)閉殺毒軟件0x80092004證書驗證失敗組件損壞需要清掉本地的Package緩存目錄強制重新校驗0x80091003下載的cab包哈希校驗不過刪除對應(yīng)緩存文件或整個布局目錄重下說一個典型的翻車場景。某次我在一臺新筆記本上裝VS2015進度走到70%直接彈安裝程序被中斷需要重新啟動計算機。重啟再跑又回到0%重新開始反復(fù)三次。后來翻日志發(fā)現(xiàn)是安裝器正在解壓的某個cab文件權(quán)限丟失原因是這臺筆記本做過文件文件夾整理遷移把用戶臨時目錄挪到了D盤安裝器寫路徑時用了環(huán)境變量%temp%但后續(xù)MSI進程用的是系統(tǒng)級Temp兩邊不一致導致文件落位失敗。解決辦法是把用戶環(huán)境變量里的TEMP/TMP重新指回C:\Users\當前用戶\AppData\Local\Temp注銷重登后安裝一次通過。這種玄學報錯本質(zhì)上就是路徑分裂老安裝器對路徑環(huán)境的容忍度極低。如果安裝失敗后你急著重裝記住一個順序先卸載再清理后重裝。老的MSI安裝體系2010及之前失敗后會在程序和功能里留下破損條目。用系統(tǒng)的卸載入口往往只能卸一半必須用msiexec /x {產(chǎn)品代碼}來硬卸產(chǎn)品代碼要到日志里查。2013和2015的安裝器用了自解壓和組件緩存崩潰后需要刪干凈以下兩個目錄再重裝C:\ProgramData\Microsoft\VisualStudio\Packages C:\Program Files (x86)\Microsoft Visual Studio x.0注意第二處目錄名里的x.0是版本號對應(yīng)比如14.0對應(yīng)VS201512.0對應(yīng)VS2013。刪之前確認沒有其他版本共用了目錄結(jié)構(gòu)2017和2015的安裝路徑是獨立的不影響。還有注冊表層面的殘留主要是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0改注冊表之前一定先導出備份。我見過有人清理殘留時把WOW6432Node下所有VisualStudio鍵全刪了結(jié)果2017版的配置也被清掉損失很大。正確姿勢是只刪對應(yīng)版本編號的項。如果裝上之后發(fā)現(xiàn)某些組件是壞的比如C編譯器缺失不用急著全卸。VS2015及以上支持修復(fù)模式到控制面板里選中Visual Studio對應(yīng)條目點擊更改或修復(fù)安裝器會利用之前的緩存重新補齊。修復(fù)前記得確認緩存目錄還在如果你做離線布局時把layout目錄刪了修復(fù)就會變成重新聯(lián)網(wǎng)下載而不是本地修復(fù)。6. 裝完之后的聯(lián)動多版本共存、工具集切換與日常運維建議安裝成功只是完成了30%的任務(wù)剩下70%是讓它好好為你干活。先講共存問題。Visual Studio從2010版開始設(shè)計上就支持與不同主版本號的版本同機共存也就是你可以在同一臺機器上同時裝VS2013、VS2015、VS2017、VS2019它們互不干擾各自有獨立的安裝目錄和配置存儲。但是有個界限同一主版本號下不同Update版本不建議共存。比如你裝了VS2015 Update 3就不要再去裝VS2015 Update 2那樣安裝器不會共存而是會升級或覆蓋搞出配置錯亂。新裝老版本時盡量裝上該版本的最高Update補丁全坑少。共存之后怎么讓不同版本各司其職關(guān)鍵是開發(fā)人員命令提示符。每個版本安裝完都會在開始菜單里生成對應(yīng)的命令提示符快捷方式比如VS2013開發(fā)人員命令提示符VS2015 x64本機工具命令提示符。它們做的事本質(zhì)是設(shè)置同一套環(huán)境變量把對應(yīng)版本目錄的VC\bin加進PATH設(shè)置INCLUDE和LIB路徑。我見過不少人圖省事自己手動把多個版本路徑全加進系統(tǒng)PATH結(jié)果編譯器版本混亂鏈接器到處找lib文件——這種問題排查起來極其痛苦。我的建議是永遠通過對應(yīng)版本的命令提示符來編譯命令行項目不要手改全局PATH。新版IDE使用舊版工具集的問題我在開頭提過。原理是MSBuild的平臺工具集機制。當你安裝了VS2013之后VS2019或VS2022里打開老項目右鍵項目屬性在常規(guī)頁的平臺工具集下拉框里選擇v120底層的MSBuild就會自動調(diào)用VS2013的編譯器和頭文件庫。這個機制從VS2015開始支持跨版本調(diào)用實際工程里非常好用。對于現(xiàn)代IDE無法打開的一些超老工程格式比如VC6的工作區(qū)還是得靠老IDE直接轉(zhuǎn)換有一個轉(zhuǎn)換向?qū)苡玫D(zhuǎn)換后的工程結(jié)構(gòu)改動很大建議轉(zhuǎn)換前備份整個源代碼目錄。裝完老版本日常使用中有幾個習慣能幫你少踩雷。第一老版本VS的自動更新提示建議直接關(guān)掉老版本更新通道基本不維護了提示更新大概率指向一個無效鏈接甚至還可能破壞當前穩(wěn)定版本。第二老版本IDE的崩潰頻率確實比新版高特別是VS2010以前的好習慣是常按CtrlShiftS保存這比依賴IDE的自動恢復(fù)靠譜。第三如果在老版本里打開新系統(tǒng)生成的代碼文件注意編碼問題。老版本默認按系統(tǒng)ANSI代碼頁處理中文注釋Windows 11中文環(huán)境默認用UTF-8的話注釋容易變成亂碼甚至導致編譯報錯??梢栽谖募4鏁r顯式選擇編碼為簡體中文(GB2312)或者設(shè)置VS的高級保存選項為UnicodeUTF-8帶簽名這個細節(jié)在接手遺留項目時特別有用。還有一個容易被忽略的輔助工具vswhere.exe。它位于新的安裝器目錄下專門用來枚舉機器上裝了哪些Visual Studio實例。多版本環(huán)境下有些構(gòu)建腳本不知道去哪找MSBuild可以在腳本里調(diào)用它定位 ${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe這樣無論機器上裝的是哪個版本腳本都能自動找到MSBuild比寫死路徑健壯得多。最后說一句實在的。老版本裝的不是軟件是一整條時間線的歷史包袱。機器上攢了好幾個版本的VS時C盤空間會肉眼可見地消失建議安裝時把能挪到D盤的組件布置到非系統(tǒng)盤。老版本雖然不更新了但它服務(wù)的那些老項目還在生產(chǎn)線上跑著的等它徹底不能用了與其糾結(jié)當初為什么不升級不如趁現(xiàn)在把老項目的遷移預(yù)案做起來一步步把代碼、依賴、構(gòu)建鏈都抽到新工具鏈上。我自己就是這么處理那臺留著VS2015的機器的先讓老項目在新IDE里能用v140編譯跑通再逐步替換第三方庫最后才敢把這臺老版本的生產(chǎn)地位降下來。這是最穩(wěn)妥的最后告別方式也是這篇文章想傳遞的核心思路。