# 四十五、請問,我可以使用連接程序嗎
原因不明,不過微軟最先進又很出色的.NET開發環境少了一個重要的工具…一個 約1950年起在軟件開發環境里就很普遍的工具,這個工具是理當所然應該有的, 真奇怪竟然沒人注意到.NET真的沒有。
少了的工具是什么?就是鏈接程序啦。鏈接程序做的事如下,它會把你的程序編 譯過的版本,和所有有用到的鏈接庫函數編譯過的版本結合起來。然后會把你沒 用到的所有鏈接庫函數都拿掉。最后再產生大家可以在自己計算機上執行的單一 可執行二位程序。
.NET用了一個叫”runt ime”的想法來取代鏈接程序。這是一大團22 MB并會動態鏈接的程序代碼,每個人在用.NET應用程序之前計算機上都得先有這東西才行。
Runtime是個和DLL很像的問題,因為版本1的應用程序在設計上是要配合版本1 的runtime,而等版本2的runtime出來,版本1的應用程序突然間就會原因不明 地不太正常,這時候你麻煩就大了。舉例來說我們把runtime由1.0升級到1.1之 后,現在公司的控制面板會把銷售數字取成小數點后4位的數字。通常不相容的 狀況要比這更糟。
事實上.NET包含了一個叫”manifests”的大型技術系統,這個系統顯然很復雜,本來的用意是要確保各個應用程序只會用到正確的runtime,不過我認識的人沒 有一個知道要怎么用。
這衍生了一個故事。在Fog Creek的新年除夕宴會上,我們要讓主要房間里的很 多計算機屏幕在午夜前倒數。Michael用C#的WinForm寫了一只程序,只用了60 秒左右。真是個偉大的開發環境。
我的工作是把countdown.exe拷到三臺計算機上執行。聽起來很簡單。
才怪。在執行檔上連雙擊就看到一個荒謬又神秘的錯誤訊息,說mscoree.dll還 是什么東西有問題,然后就是沒有意義地傾印了我的路徑。一點也沒提到問題其 實只是沒有安裝.NET runtime而已。還好我是個程序員,知道這一定就是問題。
你要怎么安裝runtime呢? 「最簡單」的方法是用Windows Update。不過Windows Update—定要我先取得所有重大的更新后才能裝runtime。這很合理,對吧?「重 大」更新里面有兩個分別是Wi ndows se「v i ce pack和新版的I nternet Explorer, 這兩個都得重開機。
就這樣,為了要在這幾臺機器執行這小小的.NET應用程序,我得下載大約70或80 MB(還好我們網絡夠快)然后重開機三四次。而這還是在一家軟件公司里!我知道 這花的確實時間,因為我一開始下載就在大電視屏幕上放映上班一條蟲(Office Space),電影放完時也幾乎快裝完了。電影每播十分鐘左右我就得起來,到每臺 計算機前去按那些笨對話盒的確定按鈕。
這就我們自己用的程序來說已經夠令人沮喪的了。不過再想想我們的產品 CityDesk。我們的使用者幾乎每個人都會在購買前下載一份免費試用版。下載文 件的大小約9 MB而且不需要任何其他東西。而這些使用者幾乎全部都還沒有.NET runtime。
如果我們要求我們的試用者(通常是小型組織或家庭用戶),只為了試用我們的應 用程序,卻要經歷整部電影長的痛苦安裝過程,我想我們大概會損失95%的潛在 客戶。這些人還不:是客戶,只是期望的客戶,我實在無法承受只為了一個較好用 的開發環境而放棄95%的期望客戶。
「不過,」人們會說:「有runtime的人數總會變多,最后人數夠多這個問題就 不見啦。」
我也這么認為,然后我了解到微軟每六到十二個月就會推出的runtime,于 是逐漸增加的已安裝人數又跳回零。如果我得痛苦掙扎在三種runt i me版本上測 試我的應用程序,只為了多那1.2%有其中一個版本的客戶,那我還真該死啊。
我只想把所有用到的東西鏈接成單一個靜態的執行文件,不用先裝任何東西就能 執行。我不在意執行檔是否會大一點。我要的只是我實際展至如勺函數、bytecode
直譯器和小小的執行時期程序。我不需要屬于runtime—部份的整個C#編譯程序。 我承諾CityDesk不會編譯到任何C#原始碼。我也不需要全部的22 MB,我要的最 多只有五或六MB吧。
我知道有些公司擁有這種技術,不過沒有獲得微軟許可不能重新發送runtime里 的數據(如byte code直譯器)。所以微軟醒醒吧,給我們一些1950年代的鏈接程 序技術吧,讓我可以制作單一個執行檔在Win 98及后續系統上執行,而且沒有其 勉夕A斑關聯。否則.NET對消費者下載軟件來說有致命的缺陷。
- 第一部分 位與字節:編程實踐點滴
- 一、語言的選擇
- 二、深入底層
- 三、joel測試:改進代碼的12個步驟
- 四、每一位軟件開發人員必須、絕對要至少具備UNICODE 與字符集知識(沒有任何例外!)
- 五、輕松寫就功能規格說明書 - 第1節:為什么煩心?
- 六、輕松寫就功能規格說明書 - 第2節:什么是規格說明書?
- 七、輕松寫就功能規格說明書 - 第3節:但是……如何?
- 八、輕松寫就功能規格說明書 - 第4節:技巧
- 九、輕松制訂軟件進度表
- 十、每日連編是朋友
- 十一、難伺候的故障修復
- 十二、軟件開發中的5個世界
- 十三、稿紙原型開發
- 十四、不要被太空架構師所嚇倒
- 十五、開火與運動
- 十六、人員技能
- 十七、源于計算機學科的三個錯誤思想
- 十八、二元文化
- 十九、自動獲取用戶故障報表
- 第二部分 開發人員的管理
- 二十、面試游擊指南
- 二十一、重金激勵害多利少
- 二十、二不配備測試人員的五個首要(錯誤)原因
- 二十三、任務換人有害無益
- 二十四、絕不去做的事情,第一部
- 二十五、冰川下的秘密
- 二十六、漏洞抽象定律
- 二十七、程序設計界的LordPalmerston
- 二十八、評測
- 第三部分 Joel對常態問題的遐想
- 二十九、RickChapman解讀愚昧
- 三十、在這個國家狗是干什么的? 我們有多么天真?
- 三十一、作為哼哈二將,只管去做事
- 三十二、兩個故事
- 三十三、巨無霸麥當勞與天才廚師JamieOliver
- 三十四、沒有什么像IT看起來那么簡單
- 三十五、提防非自主開發綜合癥
- 三十六、策略I:BEN&JERRY公司與AMAZON
- 三十七、策略II:雞與蛋問題
- 三十八、策略III:讓我回去!
- 三十九、策略IV:大件與80/20神話
- 四十、策略V:公開源代碼的經濟因素
- 四十一、墨菲法則肆掠的禮拜
- 四十二、微軟公司是如何敗北API之戰的
- 第四部分 對.NET稍多的評說
- 四十三、微軟精神失常了
- 四十四、我們的.NET對策
- 四十五、請問,我可以使用連接程序嗎