Есть много экземпляров PInvoke, которые просто вызывают Win32 API. Тем не менее, есть некоторые функциональные возможности, которые реализованы в самом CLR (например, операции с блокировкой). Если вы хотите увидеть, как это делается, посмотрите на Ротор .
Я вхожу в подробное объяснение блокировки (просмотр источника Rotor) в этой записи в моем блоге.
Чтобы конкретно ответить на ваш вопрос, вам нужно получить весь исходный код .NET (например, использовать NetMassDownloader и grep для строк, которые говорят "InternalCall" или "DllImport") и сравнить его с количество всех строк Возможно, вы могли бы умножить каждую из этих «неуправляемых» строк на какой-то фактор, чтобы угадать, или вам пришлось бы погрузиться в Rotor или исходный код Windows, чтобы получить реальные цифры. Если вы зашли так далеко, то все станет нечетко (например, если File.Open вызовет Win32 CreateFile, тогда следует ли CreateFile считать в .NET? Я думаю, что нет). Таким образом, в лучшем случае вы бы умножили «InternalCall» на некоторый коэффициент, чтобы угадать.