在看过和听了很多关于托管代码和非托管代码的内容之后,我知道唯一的区别是托管代码是关于CLR的,而非托管代码是在CLR之外的,这让我非常好奇地想详细了解它.托管和非托管代码、内存和大小都是什么?

我用C#写的代码怎么可能是非托管的,而这是C#代码,那么大小的内存怎么会变成非托管的呢.举个例子和一点见解会很有帮助.

推荐答案

简短回答:

  • Managed code是.NET代码(VB.NET、C#等)编写和编译.净CIL.
  • Unmanaged code是不在下面的代码.NET编译成直接的机器代码.

长长的答案:

什么是托管代码?

托管代码就是VisualBasic.NET和C#编译器创建.它编译成中间语言(IL),而不是可以直接在计算机上运行的机器代码.CIL保存在一个名为程序集的文件中,以及描述所创建代码的类、方法和属性(如安全要求)的元数据.该组件是系统中的一站式部署单元.网络世界.您可以将其复制到另一台服务器以在那里部署程序集,而且通常情况下,复制是部署中唯一需要的步骤.

托管代码在公共语言运行库中运行.运行时为您运行的代码提供各种各样的服务.在通常的事件过程中,它首先加载并验证程序集,以确保CIL正常.然后,在调用方法时,运行时会及时安排将它们编译为适合程序集运行的机器的机器代码,并缓存该机器代码,以便下次调用该方法时使用.(这被称为即时编译,或JIT编译,通常称为JIT.)

随着程序集的运行,运行时将继续提供安全、内存管理、线程等服务.应用程序由运行时管理.

Visual Basic.NET和C#只能生成托管代码.如果你在使用这些应用程序,你就是在制作托管代码.Visual C++.NET可以根据需要生成托管代码:创建项目时, Select 名称以开头的应用程序类型之一.管理.,例如管理C++应用程序.

什么是非托管代码?

非托管代码是在VisualStudio之前生成的代码.NET 2002发布.Visual Basic 6,Visual C++ 6,Heck,甚至15岁的C编译器,你仍然可能在硬盘上到处乱放所有的非托管代码.它直接编译成机器代码,运行在编译它的机器上,以及其他机器上,只要它们有相同的芯片,或者几乎相同.它没有从一个不可见的运行时获得安全或内存管理等服务;它从操作系统中获取它们.重要的是,它通过请求它们,通常是通过调用Windows SDK中提供的API,明确地从操作系统中获取了它们.最近的非托管应用程序通过COM调用获得操作系统服务.

与VisualStudio中的其他微软语言不同,VisualC++可以创建非托管应用程序.创建项目并 Select 名称以MFC、ATL或Win32开头的应用程序类型时,您正在创建非托管应用程序.

这可能会导致一些困惑:当你创建一个.管理的C++应用程序.构建产品是具有.exe扩展名.创建MFC应用程序时,生成产品是一个本机代码的Windows可执行文件,也带有.exe扩展名.这两个文件的内部布局完全不同.您可以使用中间语言反汇编程序ildasm查看程序集中的元数据和CIL.try 将ildasm指向非托管exe,您会被告知它没有有效的CLR(公共语言运行时)头,并且无法反汇编同一扩展名、完全不同的文件.

本地代码呢?

本机代码这一短语在两种情况下使用.许多人将它用作非托管代码的同义词:用较旧的工具构建的代码,或者在VisualC++中故意 Select 的代码,这些代码在运行时不运行,而是在机器上本地运行.这可能是一个完整的应用程序,也可能是使用COM Interop或PInvoke从托管代码中调用的COM组件或DLL,这两个强大的工具可以确保您在进入新世界时可以使用旧代码.我更愿意说.非托管代码.因为它强调代码不能获得运行时的服务.例如,托管代码中的代码访问安全性可防止从另一台服务器加载的代码执行某些 destruct 性操作.如果应用程序调用从另一台服务器加载的非托管代码,您将无法获得该保护.

本机代码的另一个用法是描述JIT编译器的输出,即实际在运行时运行的机器代码.它是被管理的,但不是CIL,而是机器代码.因此,不要仅仅假设native=unmanaged.

(Source)

.net相关问答推荐

删除数据库项目中的表

创建仅包含msBuild.Target的Nuget包

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

整个命名空间的SuppressMessage

Int32.ToString() 是特定于文化的吗?

使用 .NET 在 Windows 中创建弹出式 toastr 通知

如何在 EF 代码优先中禁用链接表的级联删除?

生产代码中的 System.Diagnostics.Debug.WriteLine

将屏幕捕获为位图

为什么要判断这个!= null?

简单委托(委托)与多播委托

使用多个 MemoryCache 实例

Await 运算符只能在 Async 方法中使用

何时在 C#/.NET 中使用指针?

VB.NET 与 C# 整数除法

等待 Async Void 方法调用以进行单元测试

为什么甚至可以更改私有成员,或使用反射在 C# 中运行私有方法?

泛型类的默认构造函数的语法是什么?

在 C# 中转义无效的 XML 字符

检测到包降级警告(dotnet core,vs 2017)