当前位置:  开发笔记 > 编程语言 > 正文

究竟什么是"托管"代码?

如何解决《究竟什么是"托管"代码?》经验,为你挑选了5个好方法。

我已经写了近二十年的C/C++代码了,我也知道Perl,Python,PHP和一些Java,我正在自学JavaScript.但我从未做过任何.NET,VB或C#的东西.托管代码究竟是什么意思?

维基百科简单地将其描述为

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

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

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

你可以将C#编译成包含VM的.exe,或者你必须将它打包并将其交给另一个.exe(一个java)吗?

与此相类似,

.NET是一种语言还是一种框架,"框架"到底意味着什么呢?

好吧,所以这不仅仅是一个问题,但对于那些曾经在我所在行业的人来说,我现在感觉N00B-ish ...



1> lnediger..:

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

为了回答你的第二个问题,.NET是一个框架,因为它是一组不是语言特定的库,编译器和VM.因此,您可以使用C#,VB,C++和任何其他具有.NET编译器的语言对.NET框架进行编码.

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

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



2> Keith Elder..:

我不认为你是孤身一人,对.Net是什么感到困惑.已经有其他答案可以覆盖你,但我会把这些信息丢给其他人.

要查看.Net"真的"只是转到c:\ Windows\Microsoft.Net\Framework

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

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

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

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

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

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

这将生成一个.exe文件.跑吧,显然会吐出"你好世界".

说Console.WriteLine()调用Framework的行.Console是一个位于System命名空间内的对象,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++,Ruby,Python,F#以及任何其他已在.Net平台上工作的语言调用Console.WriteLine()的相同方法.

我希望有所帮助.

-Keith



3> Vagnerr..:

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

另一方面,非托管代码只会"泄漏",除非您在丢弃引用之前明确释放指针.



4> Chris Upchur..:

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



5> Josh Smeaton..:

特别是在.NET和Visual C++下,您可以同时拥有非托管代码和托管代码.这些术语指的是内存分配和"管理"的方式.

非托管代码将是您习惯的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; }
}

请注意参考?这几乎指定了一个Managed类.但是当你混合使用这两种代码时,它会变得非常混乱.例如,您希望将引用指针(^)指向的托管等效项保存到非托管类中的Picture Box控件.由于垃圾收集器可以移动内存,下次当您尝试取消引用图片框时,无法找到它.运行时不会告诉您的非托管代码有关内存更改的信息.

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

正式地,托管/非托管可能归结为代码在.NET堆栈上执行的方式.但是,如果你来自c ++背景,我希望这对你来说更有意义.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有