.NET应用程序的连接器状态(又名“请先生,我可以有连接器”2009年版)

这里的许多人可能都熟悉Joel Spolsky最受欢迎的博客文章之一, 请问先生,我可以有一个链接器 ,在那里他要求删除.NET框架上的依赖关系,这样就可以开发一个独立的应用程序,出售。

当时Visual Studio开发团队的Jason Zander 对这个主题提出了自己的观点 ,他认为这个主题有些没有实际意义 – 解决运行时安全问题的能力是其主要的关注点。 总的来说,小的开销是值得的。

快进到2009年。现在有几个团体声称拥有C#连接器。 (Jason Zander甚至说自己不需要太多的实现)。我们现在有了一个大型的200-300 MB跨平台完整的.NET 3.5安装程序,而不是像.NET 1.0那样可爱,十几兆的下载。其中包含用于x86,x64和ia64的.NET版本。 微软对减less运行时间的build议包括:

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

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

我真的不知道微软在这里想的是什么。 即使假设最糟糕的情况下安装将是针对一个目标平台(例如x64),只有那些库需要包含在内,您仍然需要在应用程序开销60 mb以上。 即使是最知名的.NET应用程序之一,Paint.NET,也充满了安装应用程序的困难,因为.NET依赖性很大。 如果他们在发布免费应用程序时遇到问题,那么世界其他地方呢? 最后,他们不得不安装Microsoft Installer 3.1,.NET运行时引导程序,以及所有其他依赖库,然后才能安装自己的应用程序。

那么怎么样呢。 一个链接器。 是否有任何好的存在 – 或者只是简单地构build一个C#应用程序而不需要用户安装大量.NET运行时的工具?

更新:所以,它看起来像有几个选项:

单声道:

  • 单声道有它自己的链接器 。 从下面的答案看来,它看起来很好。

。净:

  • Xenocode似乎是可用和可用的。
  • Thinstall是另一个推荐的,它是由VMware。
  • Remotesoft还有另外一个链接器 。 他们认为这是一个“混淆器”。 那里有任何想法?
  • Rustemsoft发现另一个名为Skater .NET混淆器 。 任何人都熟悉他们?
  • 也build议微软的ILmerge ; 这看起来像只执行部分任务(即,合并库,不剥除未使用的位)。

它看起来像单声道工具正在使用; 基于.NET的工具怎么样? 有没有其他的经验,还是我们只能等待微软把它推给大家? 我不寒而栗,想到.NET 4.0需要花费多长时间…

单声道连接器的情况 。

我不能多说这里列出的其他软件,但作为单声道连接器的作者,我可以告诉它它做了什么,什么不做。

单声道链接器只是一个pipe理的链接器,所以根据定义,它需要程序集,并删除不需要的程序运行。 它不会将所有的程序集合在一起,也不会让它们成为本地程序。

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

另外,因为它只是一个托pipe工具,它正在改变程序集,如果你给它强有名的程序集,并且你没有私钥来签名,那么你将会遇到运行这些程序集的麻烦。

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

  • 链接器的介绍
  • 链接器和mkbundle结合使用

关于我们与链接器的经验。 链接器目前用于Mono项目的两个部分。 它用于生成我们为人们分发的程序集,以embedded我们的C#编译器Mono.CSharp.dll。 您可以在PDC上观看Miguel的演示文稿 ,其中介绍了我们如何做到这一点。 这非常简单,它是Linker的一个基本用法,它是一个可定制的工具,为它编写自定义步骤非常简单。

连接器的更复杂的使用是我们创build月光组件的方式 。 月光是我们Silverlight的实现,程序集是桌面程序集的一个子集。 所以我们连接桌面程序集以减小它们的大小,并且使用自定义步骤,我们正在转换公共API来匹配Silverlight的。

所以,连接器有一些相当粗糙的边界,例如命令行界面,或者你必须真正知道你在做什么,否则你可能会得到一些奇怪的程序集,但总而言之,它对我们真的很好。

FWIW

Mono已经有了一段连接器了。

这里是一个如何使用mkbundle的例子。

http://www.xenocode.com/

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

而且价格相当合理。 他们有一些更昂贵的完整的虚拟化软件(捆绑您的应用程序与其他应用程序,甚至O / S)。 但是我们并不需要所有这些。 我们一年前的成本是400美元。我觉得现在有点贵,但比Thinstall要less得多。

他们有很好的演示,你可以下载,如IE 8。不需要安装。

客户端configuration文件向Windows注册,但是以一种特殊的方式注册,因为您不希望将机器与只有客户端configuration文件的机器与具有完整.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 

这是我很久以前在.NET Rocks上听到的主要内容。 我从来没有真正的改变尝试

http://www.remotesoft.com/linker/

从来没有使用过,但是我听说你可以用.NET Reactor做类似的事情

在他写这篇文章之前,我(在我的笔名“比喻先生”)争论一段时间Joel的论坛上需要一个链接器。 连接器的扩散似乎certificate了我的担心(遗憾的是)。

http://www.thinstall.com/

从我跟他们谈过的人来说,这是相当好的,虽然最后我检查许可是繁重的(每个应用程序许可$ 2k /年)。 他们似乎瞄准IT商店,而不是SW开发人员。 你无法在他们的网站上find定价的事实表明(对我而言)这是昂贵的。

CodeProject上有一篇很棒的文章,讲述一些“连接器”以及它们是如何工作的。

http://www.codeproject.com/KB/dotnet/internals_native.aspx