Many methods in the .Net library are implemented in native code. Those that come from the framework itself are marked with [MethodImpl(MethodImplOptions.InternalCall)]
. Those that come from some unmanaged DLL are marked with [DllImport]
(e.g. [DllImport("kernel32.dll")]
). So far nothing unusual.
But while writing answer for another question, I discovered there are many methods marked with [DllImport("QCall")]
. They seem to be internal implementation of .Net (e.g. GC._Collect()
).
My question is: What exactly does [DllImport("QCall")]
mean? What is the difference between [DllImport("QCall")]
and [MethodImpl(MethodImplOptions.InternalCall)]
?
Best Answer
I asked some people in the .Net team about this.
QCalls are calls to native methods within the CLR runtime. They behave like other
[DllImport]
s, but they're faster because they make specific (undocumented) assumptions about what the native methods do, so they can skip various marshalling and GC and exception checks.InternalCall
is different; it's for calls for special reflection-style things which are generated at runtime (this wasn't very clear).