代码之家  ›  专栏  ›  技术社区  ›  Graeme Perrow

什么是“托管”代码?

  •  52
  • Graeme Perrow  · 技术社区  · 16 年前

    我写C/C++代码已经将近二十年了,我知道Perl、Python、PHP和一些java,我正在教自己JavaScript。但我从未做过任何.NET、VB或C的东西。到底是什么 管理 代码是什么意思?

    维基百科 describes it 简单地说

    在虚拟机管理下执行的代码

    它特别指出Java(通常)是托管代码,所以

    • 为什么这个词似乎只适用于C#/.NET?

    同样地,

    • NET是一个 语言 或者 框架 “框架”在这里的确切含义是什么?

    好的,这不仅仅是一个问题,但是对于像我一样在这个行业工作了这么久的人来说,我现在感觉有点不舒服。。。

    15 回复  |  直到 8 年前
        1
  •  37
  •   lnediger    8 年前

    当您将C#代码编译为.exe时,它将编译为公共中间语言(CIL)字节码。无论何时运行CIL可执行文件,它都会在Microsofts公共语言运行时(CLR)虚拟机上执行。因此,不可能在.NET可执行文件中包含VM。必须在运行程序的任何客户端计算机上安装.NET运行时。

    回答第二个问题,.NET是一个框架,因为它是一组库、编译器和虚拟机,它们不是特定于语言的。因此,您可以在.NET、.vb、C++和任何其他具有.NET编译器的语言中对.NET框架进行编码。

    https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

    上面的页面列出了具有.NET版本的语言,以及指向这些语言页面的链接。

        2
  •  13
  •   Keith Elder    16 年前

    要了解.Net“真正”是什么,只需转到c:\Windows\Microsoft.Net\Framework即可

    在其中,您将看到特定于已安装版本的文件夹。例如,如果已安装v2.0.xxxxx文件夹,请进入该文件夹。

    该文件夹中是框架。您将基本上看到一堆.exe文件和.dll文件。所有以System.*.DLL开头的DLL文件本质上都是.Net framework。

    您将在该文件夹中看到的.exe文件是开发人员和编译器的实用程序。你提到了C。查找csc.exe文件。那是你的C#编译器。

    构建一个程序非常简单。将以下代码放入hello.cs文件中。

    using System;
    class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("hello world");
            }
        }
    

    然后在命令行上键入>csc hello.cs

    这将生成一个.exe文件。运行它,它显然会吐出“hello world”。

    表示Console.WriteLine()的行正在调用框架。Console是位于系统命名空间中的对象,WriteLine()是静态方法。

    这是该Console.WriteLine()方法的反汇编代码:

    [HostProtection(SecurityAction.LinkDemand, UI=true)]
    public static void WriteLine(string value)
    {
        Out.WriteLine(value);
    }
    

    当人们说“我应该使用PHP或.Net吗?”,或者“我应该使用Python或.Net吗?”时,你就会发现这是一个错误的讨论。他们显然是在将一种语言与一种框架进行比较。C#是一种语言,它只是众多可用于在.Net平台上编写代码的语言之一。可以从C语言、VB.NET、Pascal、C++、露比、Python、F.*和任何其他在.NET平台上工作的语言调用相同的控制台方法。

    我希望这有帮助。

    -基思

        3
  •  11
  •   Vagnerr    16 年前

    主要是指所有内存分配都是为您“管理”的。如果您使用的是托管代码,那么您不必担心在使用完对象后释放它们。简单地允许它们超出范围将意味着VM最终将识别出不再存在对它们的任何引用,并将垃圾收集它们并将内存返回给系统。

    另一方面,非托管代码只会“泄漏”,除非在放弃引用之前显式释放指针。

        4
  •  10
  •   Chris Upchurch    16 年前

    它主要用于描述.NET,因为微软选择了.NET这个术语来区分.NET与C/C++和其他较旧的语言。微软之所以选择它,是因为它不是一个通常与Java相关联的术语,因为他们不想强调C#/.NET和Java之间的相似性(而不是将其称为“虚拟机代码”,这会让它听起来更像Java)。基本上,“托管代码”的使用是市场驱动的,而不是技术驱动的术语。

        5
  •  6
  •   Graeme Perrow    16 年前

    非托管代码将是您过去使用的C++内容。动态内存分配和显式释放内存。.NET运行时不为您管理内存,因此为“非托管”。

    另一方面,托管代码由运行时管理。您可以在需要的地方分配内存(通过声明变量,而不是内存空间),运行时垃圾收集器确定何时不再需要内存,并将其全部清除。垃圾收集器还将移动内存以提高效率。运行时为您“管理”所有内容。

    非托管:

    class Bar : public Foo {
        private:
                int fubar;
        public:
                Bar(int i) : fubar(i) {}
                int * getFubar() { return * fubar; }
    }
    

    管理:

    public ref class Bar :  public Foo
        private:
                int fubar;
        public:
                Bar(int i) : fubar(i) {}
                int ^ getFubar() { return ^ fubar; }
    }
    

    因此,您需要将托管对象固定在内存中,以允许非托管代码跟踪它。然后是拆箱和其他各种各样的怪癖,让你混合两者。代码的复杂性是巨大的!

    官方说法,托管/非托管可能归结为代码在.NET堆栈上的执行方式。但是,如果你来自C++背景,我希望这会对你有点关联。

        6
  •  3
  •   jodonnell    16 年前

    托管意味着代码不编译为本机代码,因此在虚拟机的支持下运行。Java编译成一种称为字节码的中间格式,Java虚拟机知道如何解释和执行字节码。所有的.NET语言都做类似的事情,编译为.NET运行时解释的IL(中间语言)。这有点令人困惑,因为.NET IL有.dll和.exe文件结尾。

        7
  •  3
  •   Kristopher Johnson    16 年前

    术语

    .NET的“字节码”(IL)与Java字节码有些不同,因为它被明确设计为在托管环境中执行之前编译为本机代码,而Java被设计为进行解释,但与平台无关的代码的概念是类似的。

        8
  •  3
  •   David L Morris    16 年前

    冒着冒犯某些人的风险,我怀疑使用managed这个词是为了让他们使用unmanaged这个词而不是compiled。虽然托管可能意味着更多,但现实情况是,它似乎主要用于区分几乎是即时编译的代码(作为对曾经解释过的代码或pcode的替代)和本机编译代码。

    或者换一种方式,您更愿意使用哪种方式:

    当然,它们实际上是一样的。

        9
  •  2
  •   HTTP 410    16 年前

    类似地,.NET是一种语言还是一个框架?这里的“框架”到底是什么意思<&书信电报;

    .NET是Microsoft当前的企业软件平台。它包括:

    用于访问Windows功能的单一通用界面:

    o The .NET Framework Class Library (FCL).
    o The FCL provides a rich set of high-level functionality for developers.
    

    用于执行.NET应用程序的单一通用语言和运行时:

    o Common Language Runtime (CLR) executes Common Intermediate Language (CIL).
    o The CLR is God: it runs, controls, and polices everything.
    

    为开发.NET应用程序选择多种语言:

    o Every development language is compiled to CIL, which is run by the CLR.
    o C# and VB are the two main development languages.
    
        10
  •  1
  •   Ed Swangren    16 年前

        11
  •  1
  •   Glenn Slaven    16 年前

    我能回答框架问题。NET是框架,C#,VB.NET等是语言。基本上,.NET提供了一个通用的库平台来调用任何使用.NET的语言都可以调用的(所有系统….DLL)。所有.NET语言都被编译成MSIL(Microsoft中间语言,更好地称为IL),然后可以在安装了相应.NET framework的任何PC上运行。

        12
  •  0
  •   GEOCHET S.Lott    16 年前

    它可以从多种语言(VB.NET、C#、IronPython、boo等)中使用

    .NET始终按解释的方式执行,不允许在.exe中包含“VM”。任何希望运行.NET应用程序的用户都必须安装该框架。

        13
  •  0
  •   user5913 user5913    16 年前

    我认为这可以实现垃圾收集和数组边界检查等功能。

        14
  •  0
  •   benjismith    16 年前

    就我个人而言,我认为“框架”这个词有点用词不当。

    NET是一个“平台”,由一个执行环境(CLR虚拟机)和一组库组成。它完全类似于Java、Perl或Python(它们都没有被称为“框架”)。

    但与“库”不同,框架寻求重新定义底层平台的基本操作。(Spring的依赖注入不需要调用普通java代码的逻辑。Qt的信号和槽实现违背普通C++代码。)

        15
  •  -1
  •   Abhi    8 年前

    托管代码——MSIL和IL以及托管代码是相同的。当我们构建应用程序时,会在Bin文件夹中生成.dll或.exe文件。这些文件称为托管代码。稍后,这些文件将被提供给CLR以生成操作系统可以理解的本机代码。