【问题标题】:Does C# require .NETC# 是否需要 .NET
【发布时间】:2011-06-28 08:37:31
【问题描述】:

我是 C# 新手(但不是编程新手),我想知道:C# 程序总是需要 .NET,还是有办法避免依赖并使应用程序独立?

【问题讨论】:

  • 目前还没有用于 C# 的静态编译器,如果存在的话,它必须删除一些可以通过 CLR 更有效地提供的功能。
  • 还请记住,在使用的大多数 Windows 版本上默认安装了 .Net 框架(您可能会偶然发现有人使用 NT4 或其他东西,但他们在不再支持整个操作系统)
  • @the_drow 我不敢苟同,请参阅Mono AoT Compiler,尤其是性能考虑部分。也就是说,AoT 编译的二进制文件中明显缺少的是“动态”功能,例如 System.Reflection。
  • 我也是 C# 的新手,并且多次使用 C,所以我发现这种讨论很有趣

标签: c# .net dependencies


【解决方案1】:

是的,C# 总是需要 .NET 运行时。

如果您担心其他平台,Mono 将允许 .NET 应用程序使用 Mono 运行时在 Windows 以外的平台(即 Linux)上运行。

C#代码被编译成CIL代码,它是一个独立于平台的指令集,我引用Wikipedia:

.NET 编程编译期间 语言,源代码是 翻译成 CIL 代码而不是 平台或处理器特定对象 代码。 CIL 是一个 CPU 和 平台无关指令集 可以在任何执行 支持共同的环境 语言基础设施,例如 Windows 上的 .NET 运行时,或 跨平台的 Mono 运行时。

【讨论】:

  • 我不明白为什么人们认为 Mono 使 C# 跨平台。当然,它会有所帮助...但是在 .NET 中执行 GUI 应用程序的推荐方法现在是 WPF,并且目前没有将其添加到 Mono 的计划。这似乎很清楚地表明您的 WPF 应用程序除了 Microsoft 操作系统之外别无他用(除非 Silverlight 对您来说足够好)。
  • Mono 有一个 Ahead Of Time 编译器。他们在 MonoTouch 中使用它来创建自包含的本机代码并遵守 iOS App Store 规则。
  • 我想我应该澄清一下。如果您以 Mono 为目标,那么您可以编写跨平台的 .NET 应用程序。如果您不预先考虑并使用最新最好的 .NET 平台和当前的最佳实践......它不太可能在 Mono 上运行。
  • @darron,除了重型 WPF 应用程序之外,还有很多事情要做。考虑服务器端。即便如此,WPF 也不是 WinForms 的替代品,而是一种补充。也就是说,没有灵丹妙药。
  • 我也读过 remotesoft.com 的 c# nativity 编译器
【解决方案2】:

CLI 运行时/解释器是必需的,但不一定是 .NET。

目前还有另一种 CLI 解释器,MONO,适用于 Linux。

【讨论】:

    【解决方案3】:

    C# 未编译为本机代码,因此计算机无法读取它。您需要 .Net 框架来转换所谓的字节码(C# 编译器编译成的代码,CLI)可以通过 .Net 框架的 Just In Time 编译器进行转换。

    Mono 是一个替代框架,它也可以运行 C#。它在更多平台上得到支持,然后是 .Net 框架(仅支持 Windows)。

    所以是的,运行 C# 应用程序需要 .Net 框架或 Mono 运行时,新版本的 Windows 会自动安装和更新 .Net 框架。

    【讨论】:

      【解决方案4】:

      显然 .NET 运行时不是必需的,例如 MonoTouch。

      【讨论】:

        【解决方案5】:

        这是可能的。 C# 只是一种编程语言,就像任何其他编程一样:它可以以您能想到的任何方式进行编译:这包括在没有 .NET 的情况下进行编译。事实上,MONO 项目(C# 适用于很多平台)就是这样做的。

        还有一些其他可用的商业编译器会假装在没有 .NET 的情况下编译您的应用程序,但它们只是将 .NET 粘贴到您的可执行文件中:这是无用、缓慢且愚蠢的。

        在没有 .NET 或 MONO 的情况下使用 C# 的任何其他方式都更像是一种教育体验,而不是一种实用的解决方案。至于教育经验的价值:如果你有时间,我肯定会建议你有更多经验时尝试类似的东西。

        【讨论】:

          【解决方案6】:

          就像 C 程序通常需要 C 运行时一样,C# 程序也需要公共语言运行时。

          【讨论】:

          • 好吧,“C 运行时库”(如在 MSVCRT 中)与“公共语言运行时”不同。没错,他们有同一个词,但第一个只是指标准化的函数库,而第二个是指平台+工具链+虚拟机+ ...
          • @Greg - 不同之处在于 C 程序只需要 MSVCRT,因为 MSVCRT 提供了硬件挂钩,否则开发人员必须从头开始实现,其次是强制执行一些基本的操作系统级别的安全性(允许如果程序试图破坏操作系统规则,操作系统会“杀死”程序)。您可以编写和编译只需要一台计算机即可运行的 C 程序。 MSVCRT 不会将编译后的代码翻译成 CPU 可以理解的内容。 MSVCRT 不提供垃圾收集。 MSVCRT 不会使针对 Linux 内核的程序在 Windows 中运行。
          • @Greg D - 不是大多数 - 所有 C# 程序都需要 CLR(或类似工作)才能运行,正如我之前所说,这不是 C 程序的要求。 C 不需要“运行时”来提供可以在其中工作的沙箱并为其提供经家长批准的工作;它可能需要它自己没有的工具,但它知道并加载到它自己的内存空间中。这里有很大的不同;这不仅仅是“实施细节”。
          • C 程序需要运行时,就像所有程序都需要一些东西来将它们加载到内存中并将 CPU 的执行寄存器指向第一条指令一样。操作系统的可执行加载程序,或多任务操作系统中的虚拟机,不是通常理解的“运行时”。甚至除此之外,C 程序只需要 MSVCRT,就像任何程序都可能需要挂钩到标准代码库一样。 “运行时”推断执行将 IL 转换为本机代码的托管代码环境。 Java 需要运行时。 C# 需要运行时。 C 没有。
          • 在所问问题的上下文中,C 运行时与 C# 运行时没有任何有用的比较。这个答案没有帮助; -1.
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-06
          • 2017-01-02
          • 1970-01-01
          相关资源
          最近更新 更多