这里的许多人可能对Joel Spolsky最受欢迎的博客文章之一Please Sir, May I Have a Linker很熟悉,在这篇文章中,他迫切需要一种方法来消除对.NET框架的依赖,以便可以开发和销售独立的应用程序。
当时,Visual Studio开发团队的Jason Zander回答with his views on the topic,认为这个话题有点无意义--在运行时修复安全问题(以及其他问题)的能力是他们主要关心的问题。总体而言,很小的开销是值得的。
快进到2009年。现在有几个小组声称拥有C#链接器。(Jason Zander甚至自己也说过,不需要太多的时间就能实现一个。)我们现在有了一个巨大的200-300MB的跨平台完整的.NET 3.5安装程序,其中包含用于x86、x64和ia64的.NET版本,而不是可爱的十几兆下载的.NET 1.0。Microsoft对减小运行时大小的建议包括:
更糟糕的是,据我所知(如果我错了,请纠正我),这个客户端配置文件甚至没有在windows中注册为安装了.NET 3.5。这意味着如果计算机上安装了多个.NET 3.5客户端应用程序,则不会互相看到任何应用程序,运行时将一次又一次地重新安装!
我真的不知道微软在想什么。即使假设最坏的情况是安装在一个目标平台上(例如x64),并且只需要包含这些库,你的应用程序上仍然会有超过60MB的开销。即使是最知名的.NET应用程序之一,Paint.NET也充斥着Difficulties installing the application because of the massive .NET dependencies.,如果他们在发布免费应用程序时遇到问题,那么世界上其他地方的情况又会怎样呢?最后,他们不得不在安装自己的应用程序之前使用Make a bootstrapper that installed Microsoft Installer 3.1, the .NET runtime bootstrapper, and all their other dependent libraires。
所以怎么样呢。一个链接器。有没有什么好的工具可以简单地构建C#应用程序,而不需要用户安装大量的.NET运行时?
更新:所以,看起来有几个选择:
单声道:
.NET:
看起来Mono工具正在被使用;基于.NET的工具呢?还有没有其他的经验,或者我们只能等待微软将其3.5推向所有人?一想到.NET 4.0需要多长时间才能发布,我就不寒而栗。
发布于 2009-03-29 13:36:35
以Mono Linker为例。
这里列出的其他软件我不能多说,但作为Mono Linker的作者,我可以知道它做什么和不做什么。
Mono链接器只是一个托管链接器,所以根据定义,它接受程序集,并删除运行程序所不需要的东西。它不会将所有的程序集合并在一起,也不会让它们成为本机程序。
有一个ILMerge的Mono.Merge克隆,但它并不完整,它的作者也没有维护它。为了生成同时包含Mono运行时和程序集的本机程序,Mono提供了mkbundle tool。
此外,由于它只是一个更改程序集的托管工具,如果你给它强命名的程序集,并且你没有私钥对它们进行签名,那么你在运行这些程序集时会遇到麻烦。
我写了几篇关于链接器的博客文章:
关于我们使用Linker的经验。Linker目前用于Mono项目的两个部分。它用于生成我们分发的程序集,以便人们嵌入我们的C#编译器Mono.CSharp.dll。你可以在PDC上观看Miguel's presentation,它描述了我们是如何做到这一点的。它非常简单,而且它是Linker的基本用法,它是一个可定制的工具,并且很容易为它编写定制步骤。
链接器的一种更复杂的用法是we create our Moonlight assemblies。Moonlight是我们Silverlight的实现,程序集是桌面程序集的子集。因此,我们链接桌面程序集以减小它们的大小,并使用自定义步骤来转换公共API以匹配Silverlight的。
所以,Linker有一些非常粗糙的边缘,比如命令行界面,或者你必须真正知道你在做什么,否则你可能会得到一些奇怪的程序集,但总而言之,它对我们来说真的很好。
发布于 2009-03-20 22:36:43
发布于 2009-03-30 04:55:40
这就是我们使用的。到目前为止,经过一年左右的有限使用(可能在野外安装了500个),没有任何问题。
而且它的价格相当合理。他们有一些更昂贵的全虚拟化软件(将你的应用程序与其他应用程序甚至操作系统捆绑在一起)。但我们并不需要所有这些。我们一年前的花费是400美元,我想现在要贵一点,但比安装要便宜得多。
他们有很棒的演示,你可以下载,比如IE 8. No install required.
https://stackoverflow.com/questions/668188
复制相似问题