.NET应用程序的链接器状态(又名“请问,请问我可以有一个链接器” 2009版)


71

这里的许多人可能都熟悉Joel Spolsky最受欢迎的博客文章之一,请问先生,我可以有一个链接器吗,他在那儿大声疾呼,希望删除对.NET框架的依赖,以便开发独立的应用程序并出售。

当时,Visual Studio开发团队的Jason Zander回答了他对该主题的看法,认为该主题有些争议-他们主要关心的是在运行时(尤其是其中)解决安全问题的能力。总的来说,少量的开销是值得的。

快进到2009年。现在有几个小组声称拥有C#链接器。(Jason Zander甚至对自己说过,实现一个应用程序并不需要太多。)而不是.NET 1.0这么可爱的十几个meg下载,我们现在有了一个庞大的200-300 mb跨平台的完整.NET 3.5安装程序。包含适用于x86,x64和ia64的.NET版本。Microsoft减少运行时大小的建议包括:

  • 解包可再发行组件,删除不需要的目标平台,然后重新组合在一起
  • 使用仅为您的平台下载库的Web引导程序
  • 使用客户端配置文件安装程序(2008年末新增),该安装程序库有限,仅适用于x86

更糟糕的是,据我了解(如果我错了,请纠正我),客户端配置文件甚至没有在Windows上注册为已安装.NET 3.5。这意味着,如果计算机上安装了多个.NET 3.5客户端应用程序,则彼此之间将不会看到对方,并且将一次又一次地重新安装运行时!

我真的不知道微软在这里想什么。即使假设最坏的情况是针对一个目标平台(例如x64)进行安装,并且只需要包括那些库,您仍然会在应用程序上看到60 mb以上的开销。即使是最著名的.NET应用程序之一,Paint.NET,也由于庞大的.NET依赖关系难以安装应用程序。 如果他们在分发免费应用程序时遇到问题,那么世界其他地方呢?最后,他们必须制作一个引导程序,该引导程序安装了Microsoft Installer 3.1,.NET运行时引导程序以及所有其他从属库然后才能安装自己的应用程序。

那呢 链接器。是否存在任何良好的应用程序-还是仅一种工具就可以构建C#应用程序而无需用户安装大量的.NET运行时?

更新:因此,看起来有两个选择:

单核细胞增多症:

。净:

看来Mono工具正在使用;基于.NET的工具呢?他们还有其他经验吗,还是我们只需要等待Microsoft向所有人推出3.5版本?我不禁思索要推出.NET 4.0需要多长时间...


ILMerge是否没有这样做的选项?
配置器

你是对的!Microsoft的网络摄像头驱动程序(本身为42M)的安装程序转到Web并下载了.NET 3.0-在1.5 M ADSL上花费了超过10分钟的时间...我要的是-仅使用网络摄像头...
Dmitry Khalatov

如果微软用不了那么长时间将.NET 3.5推向所有人,那也不会太糟。如果他们像在.NET 2.0中那样将其包含在最新的Service Pack中,则大多数人将不必处理这种胡说八道。
罗伯特·P

我尝试了Rustemsoft,但它没有这样做。这是Obfuscato底部的消息:“不建议链接.NET Framework程序集。”
尼克,2010年

thinstall链接错误。应该是vmware.com/products/thinapp
Simon,2010年

Answers:


50

在的情况下,单链接

关于这里列出的其他软件,我不能多说,但是作为Mono Linker的作者,我可以说出它的功能和不功能。

Mono链接器只是一个托管链接器,因此根据定义,它采用程序集,并删除了程序运行所不需要的内容。它不会将程序集全部合并在一起,也不会使用它们来制作本机程序。

有一个ILMerge的Mono.Merge克隆,但是它不完整,它的作者没有维护它。为了生成包含Mono运行时和程序集的本机程序,Mono提供了mkbundle工具

另外,由于它只是一个托管工具,会更改程序集,因此,如果给它提供强大的命名程序集,并且没有私钥进行签名,则在运行这些程序集时会遇到麻烦。

我写了一些有关链接器的博客文章:

关于我们在链接器上的经验。Linker当前在Mono项目的两个部分中使用。它用于生成我们分发给人们的程序集,以嵌入我们的C#编译器Mono.CSharp.dll。您可以在PDC上观看Miguel的演示,其中介绍了我们的操作方法。它非常简单,并且是Linker的基本用法,它是可自定义的工具,并且很容易为其编写自定义步骤。

链接器的更复杂用法是我们创建Moonlight程序集的方式。Moonlight是我们对Silverlight的实现,程序集是桌面程序集的子集。因此,我们链接了桌面程序集以减小其大小,并使用自定义步骤来转换公共API以匹配Silverlight。

是的,Linker有一些相当粗糙的地方,例如命令行界面,或者您必须真正知道自己在做什么,或者最终可能会得到一些奇怪的程序集,但总的来说,对我们来说真的很好。


2
该链接器还用于Monotouch,以解决Apple不允许在iPhone上安装(字节码)解释器和虚拟机的事实
马修·洛克

6
马修:嗯,不是真的。链接器在MonoTouch中使用,以减小最终应用程序的大小。是AOT编译器规避了JIT限制
Jb Evain


5

http://www.xenocode.com/

这就是我们使用的。到目前为止,一年或有限的使用(也许有500台设备在野外使用)零问题。

而且价格合理。他们有一些更昂贵的完整虚拟化软件(将您的应用与其他应用甚至操作系统捆绑在一起)。但是我们并不需要所有这些。我们大约一年前的成本是400美元,我认为它现在贵一点,但比Thinstall便宜得多。

并且它们具有可下载的出色演示,例如IE8。无需安装。


3

客户端配置文件已在Windows中注册,但是采用特殊方式,因为您不想将仅具有客户端配置文件的计算机与具有完整.net 3.5的计算机混淆

客户资料:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\DotNetClient\v3.5\Install 

完整的.net 3.5:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5\Install



2

在乔尔写那篇文章之前,我一直在争论(以我的笔名“先生先生”)在乔尔论坛上需要一个链接器。链接器的增多似乎证明了我的担忧(可悲)。

http://www.thinstall.com/

从我与之交谈的人们那里,它得到了相当不错的认可,尽管最后我检查了许可的费用(每个应用程序许可每年2000美元)。他们似乎瞄准的是IT商店,而不是软件开发商。您找不到他们网站上的价格这一事实(对我而言)表明它很昂贵。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.