gpt4 book ai didi

c# - .NET 应用程序链接器的状态(又名 "Please Sir, May I have a Linker"2009 版)

转载 作者:太空宇宙 更新时间:2023-11-03 16:35:31 25 4
gpt4 key购买 nike

这里的很多人可能都熟悉其中一个 Joel Spolsky最受欢迎的博客文章,Please Sir, May I Have a Linker ,他呼吁找到一种方法来消除对 .NET 框架的依赖,以便可以开发和销售独立的应用程序。

Jason Zander Visual Studio 开发团队的负责人当时回复了 with his views on the topic ,认为这个话题有点没有实际意义——在运行时(以及其他方面)修复安全问题的能力是他们的主要关注点。总的来说,小小的开销是值得的。

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

  • 解压可再分发文件,删除不需要的目标平台,然后将其放回原处
  • 使用只为您的平台下载库的网络 Bootstrap
  • 使用 Client Profile 安装程序(2008 年底新推出),它的库有限且仅适用于 x86

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

真不知道微软是怎么想的。即使假设最坏的安装情况是针对一个目标平台(例如,x64)并且只需要包含那些库,您的应用程序开销仍然超过 60 MB。即使是最著名的 .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 发布需要多长时间,我就不寒而栗...

最佳答案

案例Mono Linker .

我不能过多谈论此处列出的其他软件,但作为 Mono Linker 的作者,我可以说出它能做什么,不能做什么。

Mono 链接器只是一个托管链接器,因此根据定义,它采用程序集,并删除程序运行不需要的内容。它不会将所有程序集合并在一起,也不会从中创建 native 程序。

有一个 ILMerge 的 Mono.Merge 克隆,但它并不完整,而且它的作者也没有维护它。为了生成包含 Mono 运行时和程序集的 native 程序,Mono 提供了 mkbundle tool .

此外,由于它只是一个正在更改程序集的托管工具,如果您给它强命名的程序集,并且您没有私钥来对它们进行签名,那么您将无法运行这些程序集。

我写了几篇关于链接器的博文:

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

链接器的一个更复杂的使用方式是we create our Moonlight assemblies . Moonlight 是我们对 Silverlight 的实现,这些程序集是桌面程序集的一个子集。因此,我们链接我们的桌面程序集以减小它们的大小,并使用自定义步骤,我们正在转换公共(public) API 以匹配 Silverlight 的。

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

关于c# - .NET 应用程序链接器的状态(又名 "Please Sir, May I have a Linker"2009 版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com