- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这里的很多人可能都熟悉其中一个 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 减少运行时大小的建议包括:
更糟的是,据我所知(如果我错了请纠正我)客户端配置文件甚至没有在 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/
我想匹配一个可能是 0.1234567 或 1.23e-5 形式的 float 这是我的 Python 代码: import re def main(): m2 = re.findall(r'
我的申请可能有问题。有一个运行多个线程的客户端可能会通过 Java RMI 对服务器执行相当耗时的调用。当然,来自一个客户的耗时调用不应该阻止其他人。 我测试了它,它可以在我的机器上运行。所以我在客户
我已经安装了 GitHub Desktop 作为本地上传项目工具,我上传了一个项目“F:/test”,在我的 GitHub 主页上可以显示成功,然后我删除了这个仓库。 但我将这个项目重新发布到 Git
在 Ubuntu 中将 android studio 更新到 1.1.0 后总是显示此错误。我的 logcat 是: org.gradle.launcher.daemon.client.DaemonD
我用 javascript 写了一个页面,有 1000 多行代码,所以页面很重。当我在 firefox 上运行页面时,它告诉我: A script on this page may be busy,
在脚本中 difference() { polyhedron( points=[[0,0,0], [2,0,0], [2,1,0
在脚本中 difference() { polyhedron( points=[[0,0,0], [2,0,0], [2,1,0
我正在获取不属于自己的代币的 ERC721 转移。有什么帮助吗? 未处理的拒绝(错误):无法估计气体;交易可能会失败或可能需要手动 gas 限制(error={"code":-32603,"messa
我正在尝试在 Docker 容器上构建 android,我每次都会遇到此错误 ./gradlew assembleDebug :saltside-android:transformClassesWit
我的 android studio 开始卡住,所以我使用任务管理器终止了任务,当我重新打开 android studio 时,我收到了这个错误: Error:Failed to complete Gr
我正在运行一个 MEAN Stack 站点,特别是我的前端使用 Angular。我最近更新了我的 package.json 文件以将 @angular/compiler-cli 从“^7.1.4”更新
我有一个创建字符串的方法和另一个更改字符串的方法 void create(){ String s; edit(s); System.out.println(s); } void
我正在为此抓狂。当我尝试从管理页面添加“产品”时,收到 IntegrityError:main_product.img 可能不为 NULL。 模型.py class Product(models.Mo
'Treatment' 可能不会响应下面代码中的 '+findAllTreatments' 警告显示 _rootViewController.treatments = [Treatment findA
描述: 我有一个关联数组,用于存储特定月份和年份的文章计数。它看起来像这样: [ 'april 2017' => 5, 'may 2017' => 5, 'december 2014' => 5, '
Windows 10 May 2021 功能更新终于正式发布,目前正在分阶段部署推出。微软和业界人士人为,本次新功能更新的推出可能要持续数周甚至数月时间,而且部分设备可能会因为兼容性问题无法获得升级
如何消除这些警告 “警告:‘UIButton’可能不会响应‘-setPosition:’ 和 “警告:‘UIButton’可能不会响应‘-addAnimation:forKey’ 我在这里找到它们:
我正在尝试为从rss feed中解析xml创建新线程。当我单击运行时,它说有错误,请更正等。我的项目中有2个类(class)。另一个类没有错误,并且下面的此类仅警告说try/catch语句中的许多内容
考虑以下代码片段: sealed abstract class Bar object B1 extends Bar object B2 extends Bar object B3 extends Ba
我的应用有时会抛出奇怪的日志,例如: :通知名称“com.apple.iapd.notify.extendedMode”已被注册 40 次 - 这可能是泄漏:通知名称“com.apple.iapd.n
我是一名优秀的程序员,十分优秀!