首页 > 解决方案 > 如何区分 C# 中的托管和非托管代码

问题描述

根据 MSDN,

Managed Code - Code that could be understood and managed by CLR

Unmanaged Code - Code that could not handled by CLR 

但我想知道如何确定哪个资源或类符合 CLR 以及哪个不符合。

我提到了下面的链接

如果我使用的是 EF(LINQ to Entities),它会被翻译成原生 SQL。那么所有 LINQ 都属于非托管代码类别吗?

谢谢!

标签: c#asp.net-coreclr

解决方案


这里的“非托管”是指非 CLR 代码的进程内执行(不要将其与“CLR 兼容”混淆,无论这意味着什么);所以 - EF 和 LINQ 是托管的(或主要是托管的),但它们经常在某些时候间接与非托管dll 对话(想想:C/C++ dll 等 - 与 CLR 无关) - 例如,许多 ADO。 NET 提供程序实际上是非托管数据库驱动程序的 P/Invoke 层 - 或与本地进程中手动分配的原始内存(例如,unsafe通过 分配的一块内存)进行对话的代码。Marshal.AllocHGlobal通常它们以双重状态存在:有一个托管层抽象并隐藏了非托管层 - 因此应用程序级代码很少直接与非托管代码对话。

涉及本机 SQL 的事实是不相关的,因为它不是“托管的”“非托管的”——它不是在进程中的,所以它完全是一个不同的类别。


推荐阅读