исходный код net framework

Перевод нескольких статей, в т.ч. Shawn Burke (thanks!), ScottGu(thanks!), Paul Krill (thanks!) и John Robbins (First great thanks! Second great thanks!)

Если у Вас есть какие-либо проблемы, пожалуйста, для начала убедитесь что Вы выполнили все шаги. В ТОЧНОСТИ как написано у нас. Если все же ничего не помогает, обратите внимание на секцию FAQ в конце документа. Если и это не заработает, пишите Ваши комментарии, мы будем решать их все вместе.

Основная настройка

Для начала отмечу, что если у Вас установлена MS VS 2008 Express Edition, то у Вас это работать не будет.

1) Установите Visual Studio QFE. Это исправление просто обновляет DLL, которые являются частью отладчика Visual Studio, который выбирает исходные файлы. Все подробности оп исправлениям читайте на странице загрузки.

Если вы получили сообщение об ошибке установки обновления, попробуйте вставить ваш DVD VS 2008 и запустите EXE снова. Это возможно поможет установить исправление правильно.

2) Запустите Visual Studio и выберите Tools > Options > Debugging > General. Если Вы работаете над Visual Basic Profile, Вам необходимо установить флажок в нижней части диалога Options Dialog, «Show All Settings» перед тем как продолжить.

3) Далее выберите из дерева свойств Debugging > Symbols. Установите источник символов для скачивания и места на Вашем жестком диске, где Visual Studio будет их кэшировать:
Добавьте в Symbol file (.pdb) location адрес: http://referencesource.microsoft.com/symbols
Задайте расположение кэша. Убедитесь в том что это место имеет права на чтение и запись. Отличный вариант — место Ваших документов. Например, C:\Users\Stanislav\VsSymbols.
Включите флажок: Search the above locations only whan symbols are loaded manually.

Все, установка произведена!

Отладка внутри исходного кода Framework

Для этого возьмем простой пример. Создадим пустой C# Windows Application проект. Установим точку входа на Form_Load.

Эти действия позволят загрузить символы из DLL с севрера, и Вы увидете что все строки, обозначающие вызовы внутри System.Windows.Forms.dll станут черными, т.е. доступными. Также станут доступными и номера строк. Помните, что каждый раз, когда Вам понадобится посмотреть на символы, нужно будет щелкнуть правой клавишей мыши и выбрать Load Symbols.

Итак, с этого момента загружены все символы для System.Windows.Forms.dll и теперь можно смотреть его код. Код вы можете просматривать совершенно также как и во время обычной отладки своего кода. Для этого, как обычно, щелкните дважды по строке CallStack либо зайдите внутрь методов сборки по (F11). Когда Вы в первый раз попробуете просмотреть код, то Вам предложат лицензию, на основани которой Вам разрешено его читать, и если Вы согласны с ней, нажмите Accept, после чего исходный код будет загружен.

Теперь для всех сборок, в которых Вы захотите отлаживаться, просто повторите все те шаги, которые описаны выше. Если Вам понадобилось отладки тех сборок, которых нет в Call Stack, откройте окно Modules и загрузите символы оттуда.

Теперь Вы можете в примере выше зайти в код DrawRectangle по F11.

Для продвинутых пользователей

Как правило, при каждом сеансе отладки, Visual Studio пытается загрузить символы для каждой DLL, которая загружается в отлаживаемый процесс. Чтобы найти информацию по символам, она порсматривает все пути, указанные в Options > Debugging > Symbols. Но есть проекты, которые используют очень много библиотек DLL, для которых нет никакой информации по символам. В этих случаях процесс запуска отладки будет очень долгим. Это основная причина, из-за которой мы советуем Вам использовать загрузку символов по требованию пользователя.

Существует, однако, способ сделать загрузку символов автоматически (что по сути, избавляет от шага «Load Symbols»), что увеличивает общую производительность. Этот флажок имеет смысл устанавливать только продвинутым пользователям системы, поскольку потом Вам придется довольно часто возвращаться в этот диалог. Кстати, для того чтобы быстро в него зайти, выберите «Symbol Settings. » в контекстном меню на изображении повыше.

Основа этого — получить все символы, скачать их и храниьб локально. Для этого отключите флажок «Search the above locations. ».

После этого запустите свой проект в отладчике. Да, кстати, извините, совсем забыл сказать. Наберитесь терпения, чаем и булочками. В зависимости от соединения скачивать студия будет либо долго, либо очень долго. Всего понадобится скачать порядка 50 мегабайт. И т.к. все это будет закешировано, то эот будет единовременно.

Как только этот процесс завершится, можно остановить отладчик и снять источник с адресом сервера и нажать OK:

После этих шагов все символы будут загружаться автоматичсеки, и Вы будете иметь возможность вмешиваться в стек вызовов без ранних ограничений. Обратите внимание, что если Вы будете работать над другим проектом, в котором не будет информации по загруженным символам, порсто повторите все эти шаги 😉

Также проверьте ваш «C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE» (или то место, куда Вы установили Visual Studio) файл с именем symsrv.no. Если этот файл существует, переименуйте его в symsrv.yes.

2) Когда я пытаюсь зайти отладчиком внутрь исходного кода, то получаю диалог «Source is not available for this location»
Во-первых посмотрите пункт (2) в FAQ. чтобы убедиться что все символы были загружены успешно. В этом можно убедиться, посмотрев в окно Modules, в колонку статуса символов. Если символы загружены, проверьте следующее:
Если Вы настроили Microsoft Symbol Server в прошлом, и Вы загрузили символы для этой DLL, которые не содержат исходных кодов. Попробуйте указать другое положение кэша либо удалите существующий кэш, после чего поврите команду «Load Symbols». Посмотрите также FAQ (3) для получения дополнительной информации.
Убедитесь лишний раз в том что Вы включили флажок «Enable Source Server» в окне Tools > Options > Debugging > General.
Убедитесь что папка, которая настроена на сбор кэша символов, имеет разрешения на чтение и запись
Если у Вас установлена _NT_SYMBOL_PATH, она будет переопределять все эти настройки. За подробностями сюда

3) Я также использую Microsoft Symbol Server для загрузки символов. В чем разница?

Microsoft Symbol Server обеспечит Вас символами без предоставления какой-либо информации в них. Эта информация будет удалена перед публикацией. Чтобы использовать и Reference Source path и Micrososft Symbol Server это расположение Reference Source path первым в списке

Однако если у Вас Microsoft Symbol Server настраивается через _NT_SYMBOL_PATH, помните, что _NT_SYMBOL_PATH перекрывает эти настройки.

4) Есть ли поддержка 64-разрядной ОС?

Да, при условии наличия 64-разряднных версий PDB. Здесь стоит отметить что есть DLL, которые работают на различных архитектурах. Потому для них понадобится всего одна PDB.

5) Как мне установить точки останова в коде Framework?

Изначально, Visual Studio требует чтобы код в точности соответствовал PDB файлу. Хотя довольно часто PDB файлы изменены не значительно. Например, автор добавил строки с авторскими правами. Но код по-прежнему можно легко отлаживать. Просто установите точку останова (появится не полностью закрашенная точка) и укажите расположение PDB файла (контекстное меню от точки останова, позиция Location. )

Затем установите флажок, указанный ниже:

После этих действий Вы сможете спокойно продолжить работу.

6) Почему такие функции как «Go To Defenition» не работают?

Потому что эта информация создается на периоде работы с кодом, а не во время исполнения.

7) Почему некоторые члены или локальные переменные не доступны? Почему я не могу заходить внутрь некоторых методов или ходить по некоторым строчкам кода?

8) Почему так долго загружаются PDB файлы?

Потому что их много, и среди них есть файлы под 1 мегабайт.

9) Можно ли открыть и посмотреть их через браузер?

Нет, вы получите ошибку HTTP 400.

Способ #2: Скачать с официального сайта Microsoft одним архивом (любая IDE)

Для того чтобы скачать все символы и исходные коды одним архивом, пройдите по ссылке: http://referencesource.microsoft.com/netframework.aspx.
Однако из всего набора предоставленных ссылок для скачивания, у меня работала всего одна. Не солидно.

Предназначен для скачивания всех символов и исходных кодов. Работает из командной строки и доступен в исходных кодах.

Для того чтобы скачать то что нам нужно, пройдите по ссылке (.NET MASS DOWNLOADER), скачайте его и запустите следующим образом:

Настройте Visual Studio так, как показано ниже:

Источник

I would like to solve it without using any external tools (e.g. dotPeek as source server).

2 Answers 2

Go to Tools / Options / Debugging / General, and perform these settings:

Go to Tools / Options / Debugging / Symbols, and:

Unpack the downloaded archive (zip) file to a convenient path on your PC.

Note: your application may start slower since it will download PDBs from the internet.

Note: I had to restart VS several times until it «did not crash» while looking for sources, this is most likely a bug in VS.

Note: Since VS saves the path you entered for the source files, you can stop debugging or restart VS; it will work next time, too. Besides, you do not have to manually select any more source files within the framework, because the VS will use the source folder you entered and will search in source files there.

Many people wondering why they can’t step into source although they does set the checkboxes as described above. I’m, too.

Because you can extract dotnet sources to any location, Visual Studio isn’t able to know about them and the reason can’t be the source files itself (why Visual Studio doesn’t find the files).

In short: you have to search a dll version of your file (which you like to debug) which contains FULL DEBUG INFORMATION. This is also the reason why context menu disables «goto source». I’m replacing this file temporary in global assembly cache for time of debug. This works for me.

Perhabs somebody can create a public database (wiki), which everyone can add files and versions for which full debug information are available?

Источник

Если анализатор обнаруживает нарушения правил, он отправляет о них оповещение в виде предложения, предупреждения или ошибки, в зависимости от настройки каждого правила. Нарушения анализа кода появляются с префиксом CA или IDE. Этот префикс отличает их от ошибок компилятора.

Анализ качества кода

Если вы используете Visual Studio:

Включенные правила

ИД диагностикиКатегорияУровень серьезностиОписание:
CA1416СовместимостьПредупреждениеАнализатор совместимости платформ
CA1417СовместимостьПредупреждениеНе используйте OutAttribute в параметрах строки для P/Invokes
CA1831ПроизводительностьПредупреждениеПри необходимости используйте AsSpan вместо индексаторов на основе диапазона для строки
CA2013надежность;ПредупреждениеНе используйте ReferenceEquals с типами значений
CA2014надежность;ПредупреждениеНе используйте stackalloc в циклах
CA2015надежность;ПредупреждениеНе определяйте методы завершения для типов, производных от MemoryManager
CA2200ИспользованиеПредупреждениеПовторно порождайте исключения для сохранения сведений стека
CA2247ИспользованиеПредупреждениеАргумент, передаваемый конструктору TaskCompletionSource, должен иметь значение перечисления TaskCreationOptions вместо TaskContinuationOptions

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

Включение дополнительных правил

Режим анализа относится к предопределенной конфигурации анализа кода, в которой правила отключены или включены (несколько или все). В режиме анализа по умолчанию лишь небольшое количество правил включено в качестве предупреждений сборки. Вы можете изменить режим анализа для своего проекта, установив свойство в файле проекта. Допустимые значения:

ЗначениеОписание
AllDisabledByDefaultЭто самый консервативный режим. По умолчанию все правила отключены. Можно выборочно принять отдельные правила, чтобы включить их.

AllDisabledByDefault

AllEnabledByDefaultЭто самый агрессивный режим. Все правила включены как предупреждения сборки. Вы можете выборочно отказаться от отдельных правил, чтобы отключить их.

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

Рассматривать предупреждения как ошибки

Предупреждения анализа кода будут отображаться по-прежнему, но при этом они не будут нарушать сборку.

Последние обновления

Дополнительные сведения и список возможных значений см. на странице AnalysisLevel.

При установке пакета NuGet Microsoft.CodeAnalysis.NetAnalyzers не нужно добавлять свойство EnableNETAnalyzers в файл проекта или в файл Directory.Build.props. После установки пакета NuGet и задания для свойства EnableNETAnalyzers значения true создастся предупреждение сборки.

Анализ стиля кода

Правила анализа стиля кода (IDExxxx) позволяют определять и поддерживать согласованный стиль кода в базе кода. Параметры включения по умолчанию:

Полный список правил анализа стиля кода см. на этой странице.

Включение при сборке

Выполните следующие действия, чтобы включить анализ стиля кода при сборке:

В файле .editorconfig настройте каждое правило стиля кода с префиксом IDE, которое вы хотите запускать при сборке как предупреждение или ошибку. Пример.

Кроме того, вы можете настроить всю категорию как предупреждение или ошибку по умолчанию, а затем выборочно отключить правила в этой категории, которые не нужно запускать при сборке. Пример.

Отключение предупреждений

Один из способов пропустить нарушение правила — установить для параметра важности этого идентификатора правила значение none в файле EditorConfig. Пример.

Дополнительные сведения и другие способы отключения предупреждений см. на этой странице.

Сторонние анализаторы

Источник

.NET Core vs Framework. Производительность коллекций

исходный код net framework. ee3je3wvcbn6jjyma9dyv6m9p90. исходный код net framework фото. исходный код net framework-ee3je3wvcbn6jjyma9dyv6m9p90. картинка исходный код net framework. картинка ee3je3wvcbn6jjyma9dyv6m9p90. Перевод нескольких статей, в т.ч. Shawn Burke (thanks!), ScottGu(thanks!), Paul Krill (thanks!) и John Robbins (First great thanks! Second great thanks!)

Мне стало интересно, какой прирост производительности можно ожидать от Core в самых базовых классах, которые максимально часто используются в коде. Например, коллекции List, Array и Dictionary.

Если вам тоже интересно, как и почему изменилась производительность основных коллекций в Core 3 — прошу под кат!

Бенчмарки

Также я прогонял все тесты на двух дополнительных машинах (на Haswell и Sky Lake), чтобы убедиться, что результаты тестов стабильны и воспроизводятся на другом железе.

Цикл for

MethodRuntimeSizeMeanErrorStdDevRatio
IterateFor_Int.NET 4.81000565.09 ns0.191 ns0.127 ns1.00
IterateFor_Int.NET Core 2.11000451.14 ns0.236 ns0.156 ns0.80
IterateFor_Int.NET Core 3.11000451.08 ns0.143 ns0.085 ns0.80
IterateFor_String.NET 4.81000574.80 ns6.795 ns4.494 ns1.00
IterateFor_String.NET Core 2.11000460.86 ns3.771 ns2.494 ns0.80
IterateFor_String.NET Core 3.11000460.35 ns0.681 ns0.405 ns0.80

В Core JIT генерирует более эффективный код, чтение элементов из List в цикле for стало быстрее на

Цикл foreach

MethodRuntimeSizeMeanErrorStdDevRatio
IterateForEach_Int.NET 4.810001,574.5 ns2.73 ns1.81 ns1.00
IterateForEach_Int.NET Core 2.110001,575.8 ns3.82 ns2.27 ns1.00
IterateForEach_Int.NET Core 3.110001,568.1 ns0.61 ns0.40 ns1.00
IterateForEach_String.NET 4.810008,046.3 ns36.51 ns24.15 ns1.00
IterateForEach_String.NET Core 2.110006,465.0 ns15.26 ns10.09 ns0.80
IterateForEach_String.NET Core 3.110005,886.3 ns14.65 ns9.69 ns0.73

Итерирование List с ссылочными типами через foreach стало быстрее на 27%, но для значимых типов ничего не поменялось. Здесь можно оценить, насколько foreach медленнее, чем for. Разница в их эффективности на Core составляет 3.5x (value types) и 12x (reference types), примерно также как и в полном фреймворке.

Чтобы протестировать метод без ресайза внутреннего массива в тесте используется конструктор List с заданной ёмкостью (capacity).

MethodRuntimeSizeMeanErrorStdDevRatio
Add_Int.NET 4.810002,006.5 ns11.65 ns6.93 ns1.00
Add_Int.NET Core 2.110001,249.0 ns1.00 ns0.60 ns0.62
Add_Int.NET Core 3.110001,260.9 ns5.88 ns3.89 ns0.63
Add_String.NET 4.810003,250.8 ns53.13 ns35.14 ns1.00
Add_String.NET Core 2.110002,816.8 ns37.26 ns22.18 ns0.87
Add_String.NET Core 3.110002,538.2 ns30.55 ns20.21 ns0.78

Contains

Давайте возьмём негативный сценарий для метода Contains: будем искать элементы, которых нет в коллекции.

MethodRuntimeSizeMeanErrorStdDevRatio
Contains_Int.NET 4.810001,128.975 us5.4951 us3.6347 us1.00
Contains_Int.NET Core 2.11000456.040 us0.1437 us0.0950 us0.40
Contains_Int.NET Core 3.11000188.002 us0.1619 us0.0964 us0.17
Contains_String.NET 4.810004,027.20 us9.479 us5.641 us1.00
Contains_String.NET Core 2.110003,332.93 us2.156 us1.128 us0.83
Contains_String.NET Core 3.110002,723.48 us2.460 us1.464 us0.68

Кстати, раньше я всегда думал, что метод Contains внутри вызывает IndexOf, но оказалось, что это верно только для Core. В полном фреймворке это разные методы, и работают они с разной скоростью.

List Methods Summary

Сводная таблица относительной производительности (ratio) основных методов List при N = 1000.

List MethodType.NET 4.8Core 2.1Core 3.1Details
CtorInt1.000.820.47Report
CtorString1.000.900.92Report
IterateForInt1.000.800.80Report
IterateForString1.000.800.80Report
IterateForEachInt1.001.001.00Report
IterateForEachString1.000.800.73Report
AddInt1.000.620.63Report
AddString1.000.870.78Report
ContainsInt1.000.400.17Report
ContainsString1.000.830.68Report
IndexOfInt1.000.990.43Report
IndexOfString1.000.950.95Report

Array Methods Summary

Подробно останавливаться на методах массива я не буду, поскольку List — это обертка над массивом.
Так что здесь я приведу таблицу относительной производительности Array при N = 1000.

Array MethodType.NET 4.8Core 2.1Core 3.1Details
CtorInt1.000.730.88Report
CtorString1.000.750.84Report
IterateForInt1.000.861.00Report
IterateForString1.001.001.00Report
IterateForEachInt1.000.841.00Report
IterateForEachString1.001.001.00Report

Здесь можно отметить, что как и прежде, цикл foreach для массива преобразуется в обычный for. Т.е. с точки зрения производительности для итерации массива нет разницы какой из циклов использовать.

Dictionary

Randomized Hash

MethodRuntimeSizeMeanErrorStdDevRatio
Add_IntKey.NET 4.8100010.449 us0.0690 us0.0456 us1.00
Add_IntKey.NET Core 2.1100012.270 us0.0492 us0.0325 us1.17
Add_IntKey.NET Core 3.1100011.355 us0.0723 us0.0478 us1.09
Add_StringKey.NET 4.8100033.229 us0.0331 us0.0219 us1.00
Add_StringKey.NET Core 2.1100035.303 us0.1821 us0.1084 us1.06
Add_StringKey.NET Core 3.1100026.976 us0.1248 us0.0825 us0.81

Добавление в Dictionary с ключом String стало быстрее на 19%. В случае с Int ключом результат (ratio) зависит от размера: на 100 — 0.95, на 1’000 — 1.09, на 10’000 — 0.93. Отклонения небольшие, возможно, это просто «шум». На других машинах отклонения ещё меньше. Будем считать, что с ключом типа Int добавление элемента происходит примерно с той же скоростью.

GetValue

MethodRuntimeSizeMeanErrorStdDevRatio
GetValue_IntKey.NET 4.8100010.916 us0.019 us0.013 us1.00
GetValue_IntKey.NET Core 2.1100010.985 us0.135 us0.089 us1.01
GetValue_IntKey.NET Core 3.110009.424 us0.086 us0.056 us0.86
GetValue_StringKey.NET 4.8100031.622 us0.294 us0.175 us1.00
GetValue_StringKey.NET Core 2.1100031.787 us0.090 us0.047 us1.00
GetValue_StringKey.NET Core 3.1100023.572 us0.098 us0.058 us0.75

Получение элемента по строковому ключу стало быстрее на 25%, по Int ключу — на 14%. Однако, здесь есть зависимость от размера Dictionary. Чем меньше размер — тем больше Framework отстает от Core 3 и наоборот. На маленьких размерах Core 3 работает в 1.5 раза быстрей. При достижении размера в 10’000 производительность Core 3 падает до уровня Framework и даже чуть ниже (см. отчеты ниже).

В коде класса Dictionary слишком много изменений, чтобы однозначно сказать, какие из них больше всего повлияли на производительность.

Dictionary Methods Summary

Сводная таблица относительной производительности основных методов Dictionary при N = 1000.

Dictionary MethodType.NET 4.8Core 2.1Core 3.1Details
CtorInt1.000.950.62Report
CtorString1.004.063.84Report
AddInt1.001.171.09Report
AddString1.001.060.81Report
GetValueInt1.001.010.86Report
GetValueString1.001.000.75Report
ContainsKeyInt1.000.840.78Report
ContainsKeyString1.000.990.73Report
ContainsValueInt1.000.540.54Report
ContainsValueString1.000.860.90Report

Результаты

Как и ожидалось, почти все рассмотренные методы на Core 3 работают быстрее. Разница зачастую составляет 20-30%, а то и больше. Для таких базовых коллекций это отличный результат.

Код и детальные результаты всех тестов доступны на GitHub.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *