在编程中什么是托管代码或非托管代码?

我在 C # 代码中使用了一个特定的命令,这个命令工作得很好。但是,据说它在“非托管”代码中行为不当。

什么是托管代码或非托管代码?

188566 次浏览

下面是来自 MSDN 的一些关于 非托管代码的文本。

有些库代码需要调用非托管代码(例如,本机代码 API,如 Win32)。因为这意味着超出托管代码的安全范围,所以需要适当的谨慎。

下面是关于托管代码的其他一些补充说明:

  • 由 CLR 执行的代码。
  • 作为.NET Framework 基础的针对通用语言运行库的代码称为托管代码。
  • 托管代码提供 CLR 所需的元数据,以提供诸如内存管理、跨语言集成、代码访问安全性和对象的自动生存期控制等服务。所有基于 IL 的代码都作为托管代码执行。
  • 在 CLI 执行环境下执行的代码。

解决你的问题:

我认为这是因为 NUnit 为 UnitTest 执行代码,并且可能有一部分代码是非托管的。但我不确定,所以不要以为这是金子。我相信有人会给你更多的信息。希望能有帮助!

基本上,非托管代码是不在。NET CLR (亦称非 VB.NET、 C # 等)。我猜测 NUnit 有一个运行器/包装器,但它不是。NET 代码(又名 C + +)。

NUnit 在单独的 AppDomain 中加载单元测试,我假设没有调用入口点(可能不需要) ,因此入口程序集为 null。

尽可能简短地说:

  • 托管代码 = .NET 程序
  • 非托管代码 = “正常”程序

托管代码在 CLR 环境中运行,例如.NET 运行时。简而言之,所有 IL 都是托管的 但是如果你使用一些第三方软件例子 VB6或 VC + + 组件,他们是 非托管代码,因为.NET 运行时(CLR)不能控制源代码的执行 语言。

当考虑 无人管理时,考虑特定于机器的机器级代码。就像 X86汇编语言。非托管(本机)代码被编译和链接,以便直接运行在为其设计的处理器上,目前不包括所有操作系统内容。虽然不便携,但速度很快。非常简单,精简的代码。

托管 代码包括从 Java 到旧的 Interpretive BASIC 的所有代码,或者任何运行在其下的代码。NET.托管代码通常被编译成中间级别的 P-Code 或字节码指令集。这些不是机器特有的指令,尽管它们看起来类似于汇编语言。托管代码将程序与正在运行的机器隔离开来,并创建一个安全边界,在这个边界中所有内存都是间接分配的,通常情况下,您不能直接访问机器资源,如端口、内存地址空间、堆栈等。我们的想法是在一个更安全的环境中运行。

要从托管变量转换为非托管变量,您必须访问实际对象本身。它可能包装或盒装在一些额外的包装。在32位机器上,非托管变量(比如“ int”)正好占用4个字节。没有开销或额外的包装。从托管代码转换为非托管代码并再次转换的过程称为“ 调度”。它允许你的程序跨越边界。

托管代码: MSIL (中间语言)形式的代码是在语言编译器编译之后开发的,由称为托管代码的 CLR直接执行。 .net 框架支持的所有61种语言代码

非托管代码: 在 .net之前开发的代码,其 MSIL 形式不可用,它由 CLR直接执行,而 CLR将重定向到操作系统,这被称为非托管代码。

COM,Win32 API

  • 托管 代码: 用. NET 语言编写的代码,如 C # 、 VB.NET。
  • UnManaged Code: 不使用.NET 语言编写的代码,而 MSIL 使用.NET 语言编写的代码 不理解它是什么,也不能在 CLR 下运行; 就像我们在我们的。中创建的 NET 应用程序。NET 语言。

管理代码:
“合作合同”下运行的代码 通用语言运行库。托管代码必须提供元数据 运行库提供内存等服务所必需的 管理、跨语言集成、代码访问安全性,以及 对象的自动生命周期控制。所有代码基于 Microsoft 中间语言(MSIL)以托管代码的形式执行。

非托管代码:
创建的代码,而不考虑 通用语言运行库的惯例和要求 代码在通用语言运行库环境中以最小的 服务(例如,没有垃圾回收、有限的调试和 等等)。

参考资料: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx

首先了解这一点,在 .NET framework之前,Microsoft是提供独立的产品,如 MFC (Visual C++), VB, FoxPro等。

2002年,微软将其产品结合在一起。NET 架构。现在,以前如何执行代码与在。NET 架构。微软引入了 CLR的概念。NET 框架,该框架编译来自任何受支持的语言的代码。NET 框架,并提供额外的功能,如 memory mangement, garbage collection等。但是,这样的 CLR 特性在以前并不能直接使用。

因此,如果您在.NET 框架中创建库/代码(使用 CLR) ,则称为 Managed code。您可以使用这个库 进一步在其他.NET 应用程序/项目中,也是如此,CLR 将 了解它之前是如何编译的,这就是为什么它仍然是你的 管理代码。

如果希望使用以前编写的库,请使用 OTOH。NET 框架,然后你可以做一定的限制,但记住,因为 CLR 没有在那个时候,所以现在,CLR 不会理解和编译这个代码了。这个叫做 unmanaged code。请注意,由第三方为提供某些特性/工具而创建的库/程序集,如果与 CLR 不兼容,也可能被视为非管理代码。

通俗地说,管理代码是 CLR 能够理解的东西,并且可以自己编译它以便进一步执行。进去。NET 框架,(从任何语言的工作。NET 框架)当代码转到 CLR 时,代码提供一些元数据信息,这样 CLR 就可以提供指定的 给你特性。其中很少是 Garbage collection, Performance improvements, cross-language integration, memory management等。

非命名代码是机器特有的东西,随时可以使用,不需要进一步处理。

来自 Pro C # 5和.NET 4.5框架:

托管与非托管代码: 也许理解 C # 语言最重要的一点是它可以生成 只能在.NET 运行时内执行(永远不能使用 C # 构建本机 COM 服务器或 非托管 C/C + + 应用程序) .NET 运行时是托管代码。包含托管代码的二进制单元称为程序集 相反,不能直接由.NET 托管的代码 运行库称为非托管代码。

托管 代码是 C # .Net、 VB.Net、 F # .Net 等编译器创建的。它运行在 CLR 上,CLR 除了提供其他服务外,还提供垃圾收集、引用检查等服务。< strong > 可以这样理解,我的代码是由 CLR 管理的。

另一方面,无人管理代码直接编译成机器代码,不用 CLR 管理。