这里的许多人可能对Joel Spolsky篇最受欢迎的博客帖子之一Please Sir, May I Have a Linker很熟悉,在这篇博文中,他迫切希望找到一种方法来消除对.NET框架的依赖,这样就可以开发和销售独立的应用程序.

当时,Visual Studio开发团队的Jason Zander名成员回答了with his views on the topic个问题,认为这个话题有点没有意义--在运行时修复安全问题(以及其他问题)的能力是他们主要关心的问题.总体而言,很小的管理费用是值得的.

快进到2009年.现在有一些团体声称拥有C#Linker.(杰森·赞德甚至说,实施一项计划不需要太多时间.)而不是十几个可爱的梅格下载的.NET 1.0,我们现在已经完成了一个200-300 mb的大规模跨平台测试.NET 3.5安装程序,其中包含的版本.NET,用于x86、x64和ia64.微软减少运行时大小的建议包括:

  • 解压可再发行文件,移除你不想要的目标平台,然后重新组装
  • 使用只下载平台库的web bootstrap 程序
  • 使用客户端配置文件安装程序(2008年末的新功能),它的库有限,只能在x86上运行

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

我真的不知道微软在想什么.即使假设最坏的安装情况是针对一个目标平台(例如x64),并且只需要包含这些库,你的应用程序的开销仍然会超过60MB.哪怕是最知名的.网络应用,绘画.如果他们在发布一个免费应用程序时遇到问题,那么世界其他地方呢?最后,他们必须在安装自己的应用程序之前完成Make a bootstrapper that installed Microsoft Installer 3.1, the .NET runtime bootstrapper, and all their other dependent libraires个步骤.

那怎么样.链接器.有没有好的工具存在?或者有没有一个工具可以让用户在不需要安装大规模应用程序的情况下构建一个C#应用程序.NET运行时?

更新:看来有几个 Select :

单声道:

.NET:

看起来Mono工具正在被使用;那这个呢.基于网络的工具?还有其他的体验吗,还是我们只能等待微软推出3.5版给所有人?想到要花多长时间,我不寒而栗.NET 4.0即将发布...

推荐答案

Mono Linker人的情况.

我不能谈论这里列出的其他软件,但作为Mono Linker的作者,我可以告诉你它做什么和不做什么.

Mono链接器只是一个托管链接器,因此根据定义,它接受程序集,并删除程序运行所不需要的内容.它不会将所有程序集合并在一起,也不会将它们生成本机程序.

有单核细胞增多症.合并ILMerge的克隆,但它不完整,其作者也没有维护它.为了生成同时包含Mono运行时和程序集的本机程序,Mono提供了mkbundle tool.

此外,由于它只是一个更改程序集的托管工具,如果您给它强名称的程序集,并且您没有私钥对它们进行签名,那么运行这些程序集将会遇到问题.

我写了几篇关于链接器的博客帖子:

关于我们与链接器的经验.链接器目前用于Mono项目的两个部分.它用于生成我们分发给人们的程序集,以嵌入我们的C#编译器Mono.CSharp.dll.你可以在PDC观看Miguel's presentation,它描述了我们是如何做到这一点的.它非常简单,是链接器的基本用法,这是一个可定制的工具,为它编写自定义步骤非常容易.

链接器的一个更复杂的用法是Way we create our Moonlight assemblies.Moonlight是我们实现的Silverlight,程序集是桌面程序集的子集.因此,我们链接桌面程序集以减小其大小,并使用自定义步骤将公共API转换为与Silverlight的相匹配.

所以,是的,链接器有一些非常粗糙的边缘,比如命令行界面,或者你必须真正知道你在做什么,或者你可能会得到一些奇怪的程序集,但总的来说,它对我们来说非常有效.

.net相关问答推荐

如何按需计算一个值并将该值缓存在FP/F#中?

无法在 Blazor Server 应用程序中触发 InputRadio 的 onchange 事件

如何在 .Net Core EF 中组合多个条件表达式来过滤数据?

在 C# 中输入按键

为什么这两个比较有不同的结果?

ASP.NET MVC:隐藏字段值不会使用 HtmlHelper.Hidden 呈现

在 WinForms 应用程序中查找焦点控件的首选方法是什么?

指定的版本字符串不符合要求的格式 - major[.minor[.build[.revision]]]

我什么时候应该在 C# 中使用使用块?

多个等待与 Task.WaitAll - 等效?

C# 的 Actors 有什么好的实现吗?

变量MyException已声明但从未使用

双倍的? = 双倍? + 双倍?

向 .NET 应用程序添加脚本功能

当程序员说针对接口而不是对象的代码时,他们是什么意思?

一个接口是否应该继承另一个接口

使用语句与最终try

如果选中,则更改列表框项的 WPF DataTemplate

如何重新启动我的 C# WinForm 应用程序?

序列化一个可为空的 int