# 四十五、请问,我可以使用连接程序吗 原因不明,不过微软最先进又很出色的.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对消费者下载软件来说有致命的缺陷。