将.NET dll捆绑在一起以在没有.NET的计算机上运行应用程序?

8
据我所知, ngen 将 MSIL 转换为本机代码(也称为预 JIT),但我从未过多关注它的启动性能影响。Ngen 的应用程序仍需要 .NET 基类库(运行时)。
由于基类库包含我们的 .NET 程序集所需的一切(对吗?),那么是否可以将框架的 DLL 与我的 ngen 应用程序一起发布,以使其不需要安装运行时?(例如,适用于大多数 Windows XP 机器的情况)
哦,请不要提及 Remotesoft's Salamander LinkerXenocode's Postbuild。它们不适用于我的(和许多人的)当前预算(而且它们似乎只是在虚拟化环境中捆绑框架,这意味着大型下载大小和较慢的启动时间,我认为)。

编辑:
我现在知道,ngen并不是我想象中的那样。
但是,是否有可能在不使用虚拟机的情况下将.NET文件捆绑到应用程序中?

4个回答

5

你不能这样做。许多必要的组件,如垃圾回收器,都是CLR(框架运行时的一部分)的一部分,因此为了成功执行应用程序,您需要安装框架。


我明白,如果没有像Xenocode这样的产品存在,我真的会放弃绕过整个.NET设置的想法。我知道这有点固执 =P - Camilo Martin
@Camilo Martin,90%的Windows PC已经安装了.NET,65%安装了.NET 3.5 SP1(http://www.hanselman.com/blog/HowManyPCsInTheWorldHaveTheNETFrameworkInstalled.aspx)。那么为什么还要费心呢? - Darin Dimitrov
我不知道他从哪里得到这些数字,因为我相信全球不到90%的用户拥有.NET 2.0。无论如何,我只希望我的软件能够在没有安装.NET(或者说没有安装.NET 3.5 SP1)的情况下正常工作。这些统计数据可能来自被技术人员访问的小博客的日志。更不用说,在我的经验中,大多数企业/商业/工业PC都不允许安装软件,而且其中许多运行在旧操作系统上 =( - Camilo Martin
此外,IE6已经成为少数派,而且网页开发人员也不再关注它。这就是我对.NET的烦恼所在。 - Camilo Martin

2
这不是 Ngen 的工作方式。它只绕过 JIT 编译步骤。生成的 .ni.dll 文件只包含机器代码,而不是程序集的元数据。你需要保留原始程序集,并在目标计算机上安装 CLR 和 .NET framework 程序集。

很抱歉,我自己从未使用过ngen。但是,Xenocode似乎通过在虚拟文件系统中嵌入框架子集来运行,我认为它不像Win 7上的XP模式那样是完整的虚拟操作系统,因此在这样的项目中可能有一种方法可以省略荒谬的长时间.NET设置和一些对我的应用程序多余的程序集。此外,网络连接或那个臃肿的目标所有处理器200多MB的redist也是不必要的。 - Camilo Martin
1
您可以针对.NET客户端框架进行开发,它只有26MB。重新发明链接器在技术上是可行的,但他们收取的高额许可费与保持其与框架版本兼容的努力和负担相称。如果这是一个障碍,那么针对.NET可能不是正确的方法。 - Hans Passant
感谢您的评论,因为客户端框架是一个好主意,而且似乎微软并不关心开发人员如何处理遗留的操作系统 + 不同版本的框架 =( 如果我必须在没有框架安装问题的情况下让我的软件膨胀 26 MB,它已经很漂亮了 =( - Camilo Martin

2

1
起初我以为“啊,又有一个人给我发送ngen文档的链接”,现在...我在咯咯笑——他们终于想到了这个!正如他们所提到的,代码启动和运行更快,需要更少的内存,这太棒了!我想知道这将与已编写的代码兼容性如何,但即使我现在没有时间或动力尝试这个,你仍然值得获得绿色勾选,因为这现在是一个官方功能。 - Camilo Martin
@CamiloMartin 谢谢,当我发现这个消息时我也变得非常兴奋。我期望它会非常强大,因为它将随 VS 2014 一起发布。 - Saeb Amini
1
另一件让我兴奋的事情是C#将拥有?.运算符。这是多酷啊!我猜他们终于停止了为开发“全新的并行/异步方式”而花费时间的新想法,现在被迫致力于与多线程无关的功能,哈哈。 - Camilo Martin
@CamiloMartin,哇,我不知道那件事!谢谢分享。我希望有一种方法可以订阅 C#的“已完成”标签。 - Saeb Amini
嘿,有人能告诉我这个在Visual Studio 2015中是否可行吗? - beppe9000

1

是的,我知道将.NET程序集转换为本机代码(即将.NET转换为本机)是不可能的,但我想要的只是简单地捆绑我实际使用的运行时DLL(因为它们中的大多数都非常轻量级,例如system.dll仅有1 MB左右),并使用它们运行我的应用程序,同时具有运行多个应用程序和/或多个版本而无需重新打包整个内容(这是Salamander / Postbuild所做的)。我主要关心的是从框架中削减大小,并能够在没有框架的情况下运行我的代码。 - Camilo Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接