2

我问这个问题主要是为了学习。假设我想将一个非常小的控制台应用程序发送给(50 lines of code Also I am using the System.Text.RegularExpresion namespace.)在 .net framework 4.0 上使用 c# 编写的朋友。我想让应用程序可移植,因此我只是将 bin 目录的输出发送给他。

为什么他必须安装.net framework 4.0客户端,这需要相当长的时间。此外,最好只包含我计划在这种情况下使用的 dll 库 system.dll(该库包含 system.text.regularexpressions 命名空间)。

换句话说,为什么我不能在我的控制台应用程序中包含 system.dll 以使其可移植并使其在未安装 .net 框架的计算机上工作。

为什么.net framework 4.0的安装这么复杂?如果 Windows 在哪里放置所有 .net 库C:\Program Files\.net framework 4.0\,然后在安装时将密钥写入安装该框架的路径的注册表,以便程序能够找到必要的 dll,会发生什么情况。

为什么一般的安装如此复杂?

我尝试使用反射器反编译 system.dll,然后将其包含在我的项目中,但没有成功

编辑

我想我的问题应该是为什么 .net framework 4.0 需要这么长时间才能安装?如果 windows 在哪里将必要的 dll 放在程序文件上,然后将这些 dll 所在的路径写入注册表,为什么不能运行 .net framework 4.0。这个过程会快得多。为什么不这样做呢?


所以总而言之

感谢您的帮助,我现在明白了 CLR 的重要性。我想我唯一想了解的部分是为什么安装需要这么长时间。我知道有成千上万的dll。将这些 dll 解压缩到程序文件并在注册表上写入 10000 个键应该更快。

4

2 回答 2

9

您的问题似乎可以归结为“为什么我需要安装整个 .NET Framework,而不是只包含所需的 DLL?”

答案是 .NET Framework 不仅仅包含 DLL。该框架的另一个主要组件是 CLR,它负责执行和管理 .NET 代码。.NET 框架由许多其他较小的东西(例如编译器)组成,它们不是运行代码所必需的,但仍然包含在框架中。

对于 .NET,CLR 比 DLL 本身更重要。它类似于计算机上的 CPU。没有它,什么都做不了,你拥有的可执行程序只是垃圾数据。CLR 负责将您的代码 JIT 编译为本机可执行文件、内存管理等。它在概念上与 Java 应用程序的 JVM 非常相似。

甚至 DLL 也比看起来更复杂。尽管理论上您可以(暂时忽略 CLR)在您的应用程序中部署依赖 DLL,但请记住,所有这些 DLL(mscorlib 除外)都依赖于更多 DLL,依此类推,包括大量依赖对于一个简单的应用程序。

于 2012-09-11T00:22:46.280 回答
4

C# 编程语言要求首先在目标计算机上安装 .Net 框架,然后再运行目标程序。VB.NET 和 F# 具有相同的要求。.net 框架是一组非常庞大的库,不仅需要几个 .DLL 文件,还需要访问系统注册表。有相当深的集成,大部分通过 COM,但深入到 Win32(至少对于 WinForms)。

现在,微软本可以让 C# 直接编译为本机代码,但这不是他们决定做的。这些程序需要按设计安装框架。就像现在一样,.Net 框架是必需的。在 2001 年首次引入 C# 和 .Net 时,这是一笔更大的交易,因为每个人都必须安装它!今天,Windows 7(和 Vista)预装了它,使用户更容易使用。对于服务器端(网络应用程序),这也没什么大不了的,因为在许多客户端计算机上安装它并不是问题

一种看待它的方式是,每个程序都需要所有库,如果每个程序都有自己使用的 .Net 库集合,则维护错误修复会更加困难。通过在计算机上安装一个框架,当发现错误时,Microsoft 可以修补框架的一个版本,而不是如果每个程序都有自己的一组库文件,则文件可能存在的多个位置。

至于可移植性,您可以使用 Mono 在 Linux 和 Mac 上运行这些相同的 .Net (C#) 二进制文件。当然,在其他平台上,您仍然需要安装 Mono 才能使其工作。

于 2012-09-11T00:25:17.790 回答