Сколько из .NET является неуправляемым?

Часто, когда я использую отражатель, я сталкиваюсь с большим количеством небезопасных кода. Любой знает, сколько из .NET является неуправляемым / безопасным?

Ответ на: "Сколько из .NET является неуправляемым?"

Количество ответов:4

Это не имеет значения, как небезопасные звонки обернуты соответствующими объектами .NET. Что вам нужно беспокоиться о распределении ресурсов и утилизации объектов, которые реализуют IDisposable.

Есть много экземпляров PInvoke, которые просто называют Win32 API. Однако есть некоторые функциональные возможности, которые реализуются в самом CLR (например, в межблокированных операциях). Если вы хотите увидеть, как это делается, посмотрите на Rotor. .

Я иду в подробное объяснение блокировки (просмотр источника Ротор) в this post on my blog. на моем блоге.

Чтобы конкретно ответить на ваш вопрос, вам придется получить все исходный код .NET (например, использовать NetMassDownloader and grep for lines that say "InternalCall" or "DllImport") and compare that with the count of all lines. Perhaps you could multiply each of these "unmanaged" lines by some factor to guess, or you'd have to dive into Rotor or the Windows source code to get the actual numbers. If you went this far then things will get fuzzy (e.g. if File.Open calls Win32's CreateFile, then should CreateFile be counted towards .NET? I think not). So, at best you'd only multiply the "InternalCall"s by some factor to guess. и grep для строк, которые говорят "InternalCall" или "DllImport") и сравнить это с подсчетом всех строк. Возможно, вы могли бы умножить каждую из этих "неуправляемых" линий на какой-то фактор, чтобы догадаться, или вам придется погрузиться в Ротор или исходный код Windows, чтобы получить фактические цифры. Если вы зашли так далеко, то все будет получать нечеткие (например, если File.Open звонки Win32 в CreateFile, то должен CreateFile быть подсчитаны в сторону .NET? Я думаю, что нет). Таким образом, в лучшем случае вы бы только умножить "InternalCall" на какой-то фактор, чтобы угадать.

Большая часть System.Windows.Forms вызывает в неуправляемые окна API, но я не нашел необходимости вручную распоряжаться объектами, которые я создаю в этом пространстве имен.

При использовании класса System.IO.FileStream (также вызывает в неуправляемый код), убедитесь, что вы звоните Dispose, когда вы сделали, чтобы вы могли гарантировать файл закрывается прямо там, а затем вместо того, когда finalizer выполняет.

Это действительно трудный вопрос, чтобы ответить. Небезопасный код легко поддаешь количественной оценке в том смысле, что он существует в двоичном файле и может быть измерен с точки зрения инструкций IL.

Реальный неуправляемый код, скажем, PInvoke или COM, есть код в двоичном, но это незначительно. Он представляет собой лишь минимальную заглушку, необходимую для вызова в родную функцию. Это означает, что вы не можете измерить, сколько родной код в настоящее время excercised в управляемых DLL. Все, что вы можете сделать, это измерить количество вызовов, которое не дает реального измерения того, сколько неуправляемого кода выполняется.