# 四十五、请问,我可以使用连接程序吗
原因不明,不过微软最先进又很出色的.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对策
- 四十五、请问,我可以使用连接程序吗