首页 / 知识
关于c#:“托管”代码到底是什么?
2023-04-15 01:30:00

What exactly is “managed” code?我从事C / C ++代码已经有将近20年的时间了,而且我也了解Perl,Python,PHP和一些Java,并且我正在自学JavaScript。 但是我从来没有做过任何.NET,VB或C#的东西。 托管代码到底是什么意思? 维基百科将其简单描述为
它专门说Java是(通常)托管代码,因此
与此相类似,
好的,所以这不只是一个问题,但是对于一个像我一样一直从事这个行业的人来说,我现在感觉有点像N00B ... 当您将C#代码编译为.exe时,它将被编译为通用中间语言(CIL)字节码。每当您运行CIL可执行文件时,它都会在Microsoft的公共语言运行时(CLR)虚拟机上执行。因此,不能,您的.NET可执行文件中不能包含VM。您必须在将要运行程序的任何客户端计算机上安装.NET运行时。 要回答第二个问题,.NET是一个框架,因为它是一组与语言无关的库,编译器和VM。因此,您可以使用C#,VB,C ++和任何其他具有.NET编译器的语言在.NET框架上进行编码。 https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages 上面的页面列出了具有.NET版本的语言,以及指向其页面的链接。 我不认为您一个人对.Net是什么感到困惑。已经有其他答案应该让您解决,但我将为他人抛弃这些信息。 要查看" .net"真正是什么,只需转到c: Windows Microsoft.Net Framework 在其中,您会看到特定于已安装版本的文件夹。例如,如果已安装v2.0.xxxxx文件夹,则进入该文件夹。 在该文件夹中是框架。您基本上会看到一堆.exe文件和.dll文件。以System。*。dll开头的所有DLL文件本质上都是.Net框架。 您将在该文件夹中看到的.exe文件是开发人员和编译器的实用程序。您提到了C#。找到csc.exe文件。那就是你的C#编译器。 构建程序非常简单。将以下代码放入hello.cs文件中。
然后在命令行上键入> csc hello.cs 这将生成一个.exe文件。运行它,它将明显吐出" hello world"。 表示Console.WriteLine()的行正在调用Framework。 Console是驻留在System名称空间中的对象,而WriteLine()是静态方法。 这是该Console.WriteLine()方法的反汇编代码:
当人们说诸如"我应该使用PHP或.Net?"或"我应该使用Python或.Net"之类的东西时,您开始看到这是错误的讨论。他们显然正在将一种语言与一种框架进行比较。 C#是一种语言,它只是可用于在.Net平台上编写代码的众多语言之一。可以从C#,VB.Net,Pascal,C ++,Ruby,Python,F#和任何其他可以在.Net平台上运行的语言调用Console.WriteLine()的相同方法。 希望对您有所帮助。 -Keith 通常,它指的是您为您"管理"所有内存分配的事实。如果您使用的是托管代码,则不必担心在完成对象后释放对象。简单地允许它们超出范围将意味着VM最终将识别出不再有对其的引用,并且Garbage将对其进行收集以将内存返回给系统。 另一方面,除非您在丢弃引用之前显式释放指针,否则非托管代码只会"泄漏"。 它主要用于描述.NET,因为这是Microsoft选择将.NET与C / C ++和其他较旧语言区分开的术语。微软之所以选择它,是因为它不是与Java通常相关的术语,因为他们不想强调C#/。NET与Java之间的相似性(而不是称它为"虚拟机代码"之类的东西)听起来更像Java)。基本上,"托管代码"的使用是市场驱动的,而不是技术驱动的术语。 特别是在.NET和Visual C ++下,您可以同时具有非托管和托管代码。这些术语指的是分配和"管理"内存的方式。 非托管代码将是您惯用的C ++东西。动态内存分配和显式释放内存。 .NET运行时不为您管理内存,因此为"非托管"。 另一方面,托管代码由运行时管理。您在需要的地方分配内存(通过声明变量,而不是内存空间),然后运行时垃圾收集器确定何时不再需要它并对其进行清理。垃圾收集器还将移动内存以提高效率。运行时为您"管理"这一切。 如上所述,可以编写托管和非托管代码。 非网管:
管理:
注意参考吗?这几乎可以指定一个Managed类。但是,当您将两种代码混合在一起时,它会变得非常混乱。例如,您想要将引用指针(^)的托管等效项保存到非托管类中的Picture Box控件。由于垃圾收集器可以移动内存,因此下次尝试取消引用图片框时,找不到该图片框。运行时不会告诉您的非托管代码其内存更改。 因此,您需要固定内存中的托管对象以允许您的非托管代码对其进行跟踪。然后是拆箱,还有其他各种古怪的东西,您可以将两者混在一起。代码复杂度巨大! 正式地,托管/非托管可能归结为.NET堆栈上代码的执行方式。但是,如果您来自c ++背景,我希望这与您更相关。 冒犯某些风险,我怀疑使用了托管一词,因此他们可以使用非托管一词而不是编译。尽管托管可能意味着更多,但实际情况似乎是,它通常用于在实时编译(作为曾经解释过的代码或pcode的替代品)和本机编译代码之间进行大部分区分。 或者换种方式,您更愿意使用: a)可能会对系统造成不可控制的事情的非托管代码。 b)快速,可靠且接近操作系统的本机编译代码。 当然,它们实际上是同一回事。 托管意味着该代码不会编译为本机代码,因此可以在虚拟机的主持下运行。 Java编译为称为字节码的中间格式,Java VM知道该中间格式如何解释和执行。所有.NET语言都做类似的事情,编译为.NET运行时解释的IL(中间语言)。这有点令人困惑,因为.NET IL具有.dll和.exe文件结尾。 由于Microsoft使用术语"托管",因此通常仅将其应用于.NET。 Microsoft通常不将术语"虚拟机"用于.NET托管执行环境。 .NET的"字节码"(IL)与Java字节码有所不同,在于它明确设计为在托管环境中执行之前先编译为本机代码,而Java旨在进行解释,但是与平台无关的代码的概念很相似。 " .NET Framework"基本上是Microsoft提供的大量库,其中包含数千个可用于开发应用程序的类。 编译的C#.exe包含独立于平台的代码,可以在任何.NET兼容环境(包括Mono)中运行。但是,运行时通常与使用它的应用程序分开分发。
|
最新内容
相关内容
linux命令格式描述?
linux命令格式描述?,地址,图片,系统,工作,命令,信息,设备,百分比,名字,首次,linux命令的格式化命令是什么?1、Linux的磁盘格式化命令是“mkfslinux命令描述中文?
linux命令描述中文?,地址,系统,工作,信息,目录,命令,基础,工具,标准,文件,Linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目录的Python之描述符
Python之描述符,数据,情况,方法,属性,首次,代码,培训,基础,分析,上调,Descriptors(描述符)是Python语言中一个深奥但很重要的一个黑魔法,它被python到底是什么样的语言
python到底是什么样的语言,教育,软件,人工智能,培训,代码,简介,语言,类型,程序,动态,python是一种面向对象、解释型、动态类型计算机程序设计python描述符的两种类型
python描述符的两种类型,数据,培训,方法,实例,以上,更多,python描述符的两种类型1、分类数据描述符:实现了__get__和__set__两种方法的描WindowsFormsHost是否适合目的(.ne
WindowsFormsHost是否适合目的(.net WPF托管WinForms)?,WindowsFormsHost是否适合目的(.net WPF托管WinForms)?,组件,托管,应用程序,关于seo:HTML元关键字/描述元素,有用
关于seo:HTML元关键字/描述元素,有用吗?,关于seo:HTML元关键字/描述元素,有用吗?,描述,标签,关键字,网站,HTML meta keyword/description e关于c ++:如何检测/避免(非托管)代
关于c ++:如何检测/避免(非托管)代码中的内存泄漏?,关于c ++:如何检测/避免(非托管)代码中的内存泄漏?,内存泄漏,检测,最佳实践,非托管,H关于mef:.NET的哪种托管扩展框架?
关于mef:.NET的哪种托管扩展框架?,关于mef:.NET的哪种托管扩展框架?,扩展,框架,外接程序,微软的,Whither Managed Extensibility Framewo关于Windows:WPF到底是什么?
关于Windows:WPF到底是什么?,关于Windows:WPF到底是什么?,编程,新技术,代表,是一种,What exactly is WPF?我最近看到了很多有关WPF的问题Visual Studio托管过程和“操作无
Visual Studio托管过程和“操作无法完成”,Visual Studio托管过程和“操作无法完成”,执行,应用程序,提示,操作,Visual Studio Hosti关于集成:Microsoft Expression Stu
关于集成:Microsoft Expression Studio到底是什么?它如何与Visual Studio集成?,关于集成:Microsoft Expression Studio到底是什么?它如