如何在C#中区分托管代码和非托管代码

时间:2019-02-22 08:38:45

标签: c# asp.net-core clr

根据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都属于“非托管代码”类别吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

此处的“非托管”是指非CLR代码的进程内执行(无论将其与“符合CLR的代码”混为一谈,这可能意味着什么);因此-EF和LINQ是受管理的(或大部分受管理的),但是它们有时经常与不受管理的 dll(例如:C / C ++ dll等,与CLR无关)进行间接对话-对于例如,许多ADO.NET提供程序实际上是非托管数据库驱动程序的P / Invoke层-或unsafe代码,它们与本地进程中手动分配的原始内存进行通信(例如,通过Marshal.AllocHGlobal分配的内存)。通常,它们以双重状态存在:有一个 managed 层来抽象并隐藏 unmanaged 层-因此应用程序级代码很少会直接与非托管代码对话。

涉及本机SQL的事实是无关的,因为它不是“托管的” “非托管的”-它不是进程内的,因此完全是另一类。 / p>