Runtime: Очистить мертвый код

Созданный на 5 апр. 2017  ·  152Комментарии  ·  Источник: dotnet/runtime

После включения монокомпоновщика для наших двоичных файлов .NETCoreApp он определил ряд мест, где у нас есть мертвый код.

Они делятся на 3 категории.

  1. По-настоящему мертвый код, который нигде в сборке не используется.

    • Это можно удалить

  2. Исходные файлы, которые используются в одной сборке сборки, но не во всех. Общие исходные файлы, в которых некоторые проекты используют исходный код, но не все.

    • Они могут быть лучше учтены, разделены, чтобы обеспечить минимальный источник там, где это необходимо. Или они могут содержать действительно мертвый код.

  3. Исходный код только во время компиляции. Внутренние константы, которые представлены в виде литералов при вызове IL и не публикуются.

    • Эти должны остаться.

различия

  • [ ] [Microsoft.CSharp](http://tempcoverage.blob.core.windows.net/report2/Microsoft.CSharp.diff.html) ( csv )
  • [ ] [Microsoft.VisualBasic](http://tempcoverage.blob.core.windows.net/report2/Microsoft.VisualBasic.diff.html) ( csv )
  • [x] [System.Collections.Concurrent](http://tempcoverage.blob.core.windows.net/report2/System.Collections.Concurrent.diff.html) ( csv )
  • [x] [System.Collections](http://tempcoverage.blob.core.windows.net/report2/System.Collections.diff.html) ( csv ) — PR dotnet/corefx#19140 от @YoupHulsebos
  • [x] [System.Collections.Immutable](http://tempcoverage.blob.core.windows.net/report2/System.Collections.Immutable.diff.html) ( csv ) — @YoupHulsebos ничего не удаляет в https: //github.com/dotnet/corefx/issues/17905#issuecomment-298154133
  • [x] [System.Collections.NonGeneric](http://tempcoverage.blob.core.windows.net/report2/System.Collections.NonGeneric.diff.html) ( csv ) — @YoupHulsebos ничего не удаляет в https: //github.com/dotnet/corefx/issues/17905#issuecomment-298154133
  • [x] [System.Collections.Specialized](http://tempcoverage.blob.core.windows.net/report2/System.Collections.Specialized.diff.html) ( csv )
  • [x] [System.ComponentModel.Annotations](http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.Annotations.diff.html) ( csv ) @norek
  • [x] [System.ComponentModel](http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.diff.html) ( csv )@norek
  • [x] [System.ComponentModel.EventBasedAsync](http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.EventBasedAsync.diff.html) ( csv )@norek
  • [x] [System.ComponentModel.Primitives](http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.Primitives.diff.html) ( csv )@norek
  • [x] [System.ComponentModel.TypeConverter](http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.TypeConverter.diff.html) ( csv )@norek
  • [x] [System.Console](http://tempcoverage.blob.core.windows.net/report2/System.Console.diff.html) ( csv )
  • [x] [System.Data.Common](http://tempcoverage.blob.core.windows.net/report2/System.Data.Common.diff.html) ( csv ) — исправлено в dotnet/corefx#19141 пользователем @ YoupHulsebos
  • [x] [System.Diagnostics.Debug](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.Debug.diff.html) ( csv )
  • [x] [System.Diagnostics.DiagnosticSource](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.DiagnosticSource.diff.html) ( csv )
  • [x] [System.Diagnostics.FileVersionInfo](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.FileVersionInfo.diff.html) ( csv )
  • [x] [System.Diagnostics.Process](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.Process.diff.html) ( csv )
  • [x] [System.Diagnostics.StackTrace](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.StackTrace.diff.html) ( csv )
  • [x] [System.Diagnostics.TextWriterTraceListener](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.TextWriterTraceListener.diff.html) ( csv )
  • [x] [System.Diagnostics.Tools](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.Tools.diff.html) ( csv )
  • [x] [System.Diagnostics.TraceSource](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.TraceSource.diff.html) ( csv )
  • [x] [System.Diagnostics.Tracing](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.Tracing.diff.html) ( csv )
  • [x] [System.Drawing.Primitives](http://tempcoverage.blob.core.windows.net/report2/System.Drawing.Primitives.diff.html) ( csv )
  • [ ] [System.IO.Compression](http://tempcoverage.blob.core.windows.net/report2/System.IO.Compression.diff.html) ( csv )
  • [x] [System.IO.Compression.ZipFile](http://tempcoverage.blob.core.windows.net/report2/System.IO.Compression.ZipFile.diff.html) ( csv )
  • [ ] [System.IO.FileSystem.AccessControl](http://tempcoverage.blob.core.windows.net/report2/System.IO.FileSystem.AccessControl.diff.html) ( csv )
  • [ ] [System.IO.FileSystem](http://tempcoverage.blob.core.windows.net/report2/System.IO.FileSystem.diff.html) ( csv )
  • [x] [System.IO.FileSystem.DriveInfo](http://tempcoverage.blob.core.windows.net/report2/System.IO.FileSystem.DriveInfo.diff.html) ( csv )
  • [x] [System.IO.FileSystem.Watcher](http://tempcoverage.blob.core.windows.net/report2/System.IO.FileSystem.Watcher.diff.html) ( csv )
  • [x] [System.IO.IsolatedStorage](http://tempcoverage.blob.core.windows.net/report2/System.IO.IsolatedStorage.diff.html) ( csv )
  • [x] [System.IO.MemoryMappedFiles](http://tempcoverage.blob.core.windows.net/report2/System.IO.MemoryMappedFiles.diff.html) ( csv )
  • [x] [System.IO.Pipes](http://tempcoverage.blob.core.windows.net/report2/System.IO.Pipes.diff.html) ( csv )
  • [x] [System.Linq](http://tempcoverage.blob.core.windows.net/report2/System.Linq.diff.html) ( csv ) — удалять нечего, https://github.com/dotnet /corefx/issues/17905#issuecomment-294286344 @JonHanna
  • [x] [System.Linq.Expressions](http://tempcoverage.blob.core.windows.net/report2/System.Linq.Expressions.diff.html) ( csv )
  • [x] [System.Linq.Parallel](http://tempcoverage.blob.core.windows.net/report2/System.Linq.Parallel.diff.html) ( csv ) — исправлено в dotnet/corefx#19143 пользователем @ YoupHulsebos
  • [x] [System.Linq.Queryable](http://tempcoverage.blob.core.windows.net/report2/System.Linq.Queryable.diff.html) ( csv ) — удалять нечего — https://github .com/dotnet/corefx/issues/17905#issuecomment-294286344 @JonHanna
  • [ ] [System.Net.Http](http://tempcoverage.blob.core.windows.net/report2/System.Net.Http.diff.html) ( csv )
  • [ ] [System.Net.HttpListener](http://tempcoverage.blob.core.windows.net/report2/System.Net.HttpListener.diff.html) ( csv )
  • [x] [System.Net.Mail](http://tempcoverage.blob.core.windows.net/report2/System.Net.Mail.diff.html) ( csv ) — исправлено в dotnet/corefx#19532 пользователем @ Эрмиар
  • [x] [System.Net.NameResolution](http://tempcoverage.blob.core.windows.net/report2/System.Net.NameResolution.diff.html) ( csv )
  • [ ] [System.Net.NetworkInformation](http://tempcoverage.blob.core.windows.net/report2/System.Net.NetworkInformation.diff.html) ( csv )
  • [x] [System.Net.Ping](http://tempcoverage.blob.core.windows.net/report2/System.Net.Ping.diff.html) ( csv )
  • [ ] [System.Net.Primitives](http://tempcoverage.blob.core.windows.net/report2/System.Net.Primitives.diff.html) ( csv )
  • [ ] [System.Net.Requests](http://tempcoverage.blob.core.windows.net/report2/System.Net.Requests.diff.html) ( csv )
  • [ ] [System.Net.Security](http://tempcoverage.blob.core.windows.net/report2/System.Net.Security.diff.html) ( csv )
  • [x] [System.Net.ServicePoint](http://tempcoverage.blob.core.windows.net/report2/System.Net.ServicePoint.diff.html) ( csv )
  • [ ] [System.Net.Sockets](http://tempcoverage.blob.core.windows.net/report2/System.Net.Sockets.diff.html) ( csv )
  • [ ] [System.Net.WebClient](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebClient.diff.html) ( csv )
  • [ ] [System.Net.WebHeaderCollection](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebHeaderCollection.diff.html) ( csv )
  • [x] [System.Net.WebProxy](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebProxy.diff.html) ( csv )
  • [ ] [System.Net.WebSockets.Client](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebSockets.Client.diff.html) ( csv )
  • [ ] [System.Net.WebSockets](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebSockets.diff.html) ( csv )
  • [x] [System.Numerics.Vectors](http://tempcoverage.blob.core.windows.net/report2/System.Numerics.Vectors.diff.html) ( csv )
  • [x] [System.ObjectModel](http://tempcoverage.blob.core.windows.net/report2/System.ObjectModel.diff.html) ( csv )
  • [ ] [System.Private.DataContractSerialization](http://tempcoverage.blob.core.windows.net/report2/System.Private.DataContractSerialization.diff.html) ( csv )
  • [ ] [System.Private.Uri](http://tempcoverage.blob.core.windows.net/report2/System.Private.Uri.diff.html) ( csv )
  • [x] [System.Private.Xml](http://tempcoverage.blob.core.windows.net/report2/System.Private.Xml.diff.html) ( csv )
  • [x] [System.Private.Xml.Linq](http://tempcoverage.blob.core.windows.net/report2/System.Private.Xml.Linq.diff.html) ( csv )
  • [x] [System.Reflection.DispatchProxy](http://tempcoverage.blob.core.windows.net/report2/System.Reflection.DispatchProxy.diff.html) ( csv )
  • [x] [System.Reflection.Metadata](http://tempcoverage.blob.core.windows.net/report2/System.Reflection.Metadata.diff.html) ( csv )
  • [x] [System.Reflection.TypeExtensions](http://tempcoverage.blob.core.windows.net/report2/System.Reflection.TypeExtensions.diff.html) ( csv )
  • [x] [System.Resources.Writer](http://tempcoverage.blob.core.windows.net/report2/System.Resources.Writer.diff.html) ( csv )
  • [x] [System.Runtime.CompilerServices.VisualC](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.CompilerServices.VisualC.diff.html) ( csv )
  • [ ] [System.Runtime](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.diff.html) ( csv )
  • [x] [System.Runtime.Extensions](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.Extensions.diff.html) ( csv )
  • [x] [System.Runtime.InteropServices](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.InteropServices.diff.html) ( csv )
  • [x] [System.Runtime.InteropServices.RuntimeInformation](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.InteropServices.RuntimeInformation.diff.html) ( csv )
  • [x] [System.Runtime.Numerics](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.Numerics.diff.html) ( csv )
  • [x] [System.Runtime.Serialization.Formatters](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.Serialization.Formatters.diff.html) ( csv ) — исправлено в dotnet/corefx #19148 от @yaelkeemink
  • [ ] [System.Runtime.Serialization.Primitives](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.Serialization.Primitives.diff.html) ( csv )
  • [ ] [System.Security.AccessControl](http://tempcoverage.blob.core.windows.net/report2/System.Security.AccessControl.diff.html) ( csv )
  • [ ] [System.Security.Claims](http://tempcoverage.blob.core.windows.net/report2/System.Security.Claims.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Algorithms](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Algorithms.diff.html) ( csv ) @mccbraxton
  • [ ] [System.Security.Cryptography.Cng](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Cng.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Csp](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Csp.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Encoding](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Encoding.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.OpenSsl](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.OpenSsl.diff.html) ( csv )
  • [x] [System.Security.Cryptography.Primitives](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Primitives.diff.html) ( csv )
  • [x] [System.Security.Cryptography.X509Certificates](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.X509Certificates.diff.html) ( csv ) — исправлено в dotnet/corefx #19144 от @yaelkeemink
  • [x] [System.Security.Principal](http://tempcoverage.blob.core.windows.net/report2/System.Security.Principal.diff.html) ( csv ) — удалять нечего
  • [x] [Microsoft.Win32.Primitives](http://tempcoverage.blob.core.windows.net/report2/Microsoft.Win32.Primitives.diff.html) ( csv )
  • [x] [Microsoft.Win32.Registry](http://tempcoverage.blob.core.windows.net/report2/Microsoft.Win32.Registry.diff.html) ( csv )
  • [ ] [Microsoft.XmlSerializer.Generator](http://tempcoverage.blob.core.windows.net/report2/Microsoft.XmlSerializer.Generator.diff.html) ( csv )
  • [x] [System.Security.Principal.Windows](http://tempcoverage.blob.core.windows.net/report2/System.Security.Principal.Windows.diff.html) ( csv ) — dotnet/corefx#18267
  • [x] [System.Text.RegularExpressions](http://tempcoverage.blob.core.windows.net/report2/System.Text.RegularExpressions.diff.html) ( csv ) — dotnet/corefx#18134
  • [x] [System.Threading](http://tempcoverage.blob.core.windows.net/report2/System.Threading.diff.html) ( csv ) — dotnet/corefx#18134
  • [x] [System.Threading.Overlapped](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Overlapped.diff.html) ( csv ) — dotnet/corefx#18134
  • [x] [System.Threading.Tasks.Dataflow](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Tasks.Dataflow.diff.html) ( csv ) — dotnet/corefx#17998
  • [x] [System.Threading.Tasks.Extensions](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Tasks.Extensions.diff.html) ( csv ) — удалять нечего
  • [x] [System.Threading.Tasks.Parallel](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Tasks.Parallel.diff.html) ( csv ) — удалять нечего
  • [x] [System.Threading.Thread](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Thread.diff.html) ( csv ) — удалять нечего
  • [x] [System.Transactions.Local](http://tempcoverage.blob.core.windows.net/report2/System.Transactions.Local.diff.html) ( csv )
  • [x] [System.Web.HttpUtility](http://tempcoverage.blob.core.windows.net/report2/System.Web.HttpUtility.diff.html) ( csv ) — удалять нечего
  • [x] [System.Xml.XPath.XDocument](http://tempcoverage.blob.core.windows.net/report2/System.Xml.XPath.XDocument.diff.html) ( csv ) — удалять нечего

задний план

Отчеты были сгенерированы путем включения ILLink (сборка монокомпоновщика от команды codegen /cc @erozenfeld) и сравнения вывода.

Различия взяты из сборки Windows и ограничены только сборками, которые являются частью NETCore.App.

Когда компоновщик включен, он создаст папку «PreTrim» в папке объекта сборки, например, <corefx>\bin\obj\AnyOS.AnyCPU.Debug\Microsoft.CSharp\netstandard\PreTrim\Microsoft.CSharp.dll .

Чтобы включить центральную копию обрезанных сборок, вы можете установить свойство BinPlaceILLinkTrimAssembly=true , при этом все предварительно обрезанные и обрезанные сборки будут скопированы в папку под bin: <corefx>\bin\ILLinkTrimAssembly\netcoreapp-Windows_NT-Debug-x64 .

Для создания отчетов, связанных в этом выпуске, у вас должна быть копия инструмента AsmDiff.exe. Этот инструмент еще недоступен для ядра, см. (https://github.com/dotnet/buildtools/issues/1420). Если у вас есть настольная версия инструмента, вы можете включить создание отчетов, установив AsmDiffCmd=<pathToAsmDiff.exe>

Компоновщик можно включить для любого проекта (не только в NETCore.App) путем сборки с помощью ILLinkTrimAssembly=true после слияния https://github.com/dotnet/corefx/pull/17825.

как разобраться с библиотекой

Выберите библиотеку и отметьте, что собираетесь над ней работать.

Откройте приведенный выше HTML-отчет для библиотеки. Найдите линии красного цвета. Теоретически они мертвы. Найдите код в папке src этого репозитория и удалите его. Продолжите отчет для библиотеки и удалите весь такой мертвый код.

НО есть несколько особых случаев:

  1. Это очень распространено. Все, что содержит «const», игнорируйте. Это все поля, встроенные компилятором, мы хотим сохранить их в исходниках. Обычно целые числа и строки.
  2. Все, что является «статической строкой» в «классе SR», является особенным. Вместо редактирования файла C# вы должны найти соответствующую запись в файле .resx и удалить ее. Файл .resx для библиотеки находится в src\<library>\src\Resources\strings.resx . Сборка восстановит SR после того, как вы это сделаете. Игнорируйте все остальное в «классе SR» — есть несколько методов, которые могут оказаться мертвыми.
  3. Игнорируйте любые закрытые конструкторы без параметров. У нас есть они в коде, чтобы предотвратить случайное создание экземпляра класса, мы хотим сохранить их в коде.
  4. Игнорируйте любые общедоступные конструкторы без параметров, если нет других конструкторов. Это не реально.
  5. Некоторый код не будет в папке библиотеки, он будет в src\common. Этот код на самом деле не может быть мертвым, потому что его может использовать другая библиотека. В идеале используйте grep, чтобы узнать, использует ли его кто-либо еще в дереве — если да, его можно удалить. Или проигнорируйте его, и мы можем сделать еще один проход позже.
  6. Если код используется только в Unix, UAP и т. д., не удаляйте его. Скорее всего не умер. Вы можете определить, относится ли он к этому типу, если он окружен, например, #if uap или имеет условие в файле .csproj, например, '$(TargetGroup)' == 'uap'"

После того, как вы удалили мертвый код из библиотеки, убедитесь, что он собирается (запустите «msbuild» в папке «src» для библиотеки). Если это не так, идите назад. Если он собирается, затем проверьте сборку и прохождение тестов (запустите «msbuild /t:buildandtest» в папке «tests»). Опять же, если они этого не сделают, повторите свои действия.

Если все выглядит хорошо, вы можете сделать PR для библиотеки. Когда появится PR, мы можем отметить его здесь.

area-Meta easy enhancement untriaged up-for-grabs

Все 152 Комментарий

Вот таблица со списком различий в байтах в порядке убывания. У XML уже есть проблема

| | | |
|------------------------------------------------- ------|---------------|------------|
| Библиотека | Байты удалены | % уменьшение |
| ИТОГО | 1221632 | 7,62% |
| Microsoft.XmlSerializer.Generator.dll | 392704 | 46,29% |
| System.Private.Xml.dll — dotnet/runtime#20506 | 93696 | 2,54% |
| System.Net.Http.dll | 42496 | 12,89% |
| System.Private.DataContractSerialization.dll | 39936 | 4,40% |
| System.ComponentModel.TypeConverter.dll | 36352 | 10,71% |
| System.Data.Common.dll | 36352 | 2,97% |
| System.IO.FileSystem.dll | 32768 | 26,56% |
| System.Net.HttpListener.dll | 32256 | 9,39% |
| System.Runtime.Extensions.dll | 31744 | 12,20% |
| System.Net.Mail.dll | 28672 | 10,81% |
| System.Net.Security.dll | 24064 | 9,73% |
| System.Security.Cryptography.X509Certificates.dll | 23552 | 15,13% |
| System.Net.WebSockets.Client.dll | 22016 | 27,22% |
| System.Net.Primitives.dll | 20992 | 21,58% |
| System.Net.Requests.dll | 20480 | 11,56% |
| System.IO.FileSystem.DriveInfo.dll | 18944 | 47,44% |
| System.Transactions.Local.dll | 17920 | 9,70% |
| System.Net.NetworkInformation.dll | 17408 | 15,45% |
| System.Net.NameResolution.dll | 15360 | 28,30% |
| System.Net.WebHeaderCollection.dll | 14336 | 34,57% |
| System.Net.Sockets.dll | 12288 | 5,35% |
| System.IO.FileSystem.Watcher.dll | 11776 | 28,40% |
| System.IO.Compression.dll | 11264 | 7,83% |
| System.Security.Cryptography.Algorithms.dll | 10240 | 7,04% |
| System.Threading.dll | 10240 | 15,15% |
| System.IO.Pipes.dll | 9728 | 14,18% |
| System.Diagnostics.Process.dll | 9216 | 7,83% |
| System.Security.Cryptography.Encoding.dll | 9216 | 22,22% |
| System.IO.MemoryMappedFiles.dll | 8704 | 19,77% |
| System.Security.Cryptography.Csp.dll | 8704 | 9,83% |
| System.Security.AccessControl.dll | 8192 | 7,69% |
| System.Security.Cryptography.Cng.dll | 7680 | 7,04% |
| System.Collections.dll | 7168 | 5,88% |
| System.Net.Ping.dll | 7168 | 15,05% |
| System.Console.dll | 6656 | 7,51% |
| System.Linq.Expressions.dll | 6656 | 1,03% |
| System.Security.Principal.Windows.dll | 6656 | 9,29% |
| Microsoft.Win32.Registry.dll | 6144 | 12,77% |
| System.Private.Uri.dll | 6144 | 5,41% |
| System.Net.WebClient.dll | 5632 | 8,27% |
| System.Private.Xml.Linq.dll | 5632 | 3,37% |
| Microsoft.CSharp.dll | 4096 | 0,78% |
| System.ComponentModel.Primitives.dll | 4096 | 16,00% |
| System.Reflection.Metadata.dll | 4096 | 0,81% |
| System.Threading.Tasks.Dataflow.dll | 4096 | 1,86% |
| System.Diagnostics.StackTrace.dll | 3584 | 20,59% |
| System.IO.FileSystem.AccessControl.dll | 3584 | 12,96% |
| System.Linq.Parallel.dll | 3584 | 1,41% |
| System.Text.RegularExpressions.dll | 3584 | 2,59% |
| System.IO.IsolatedStorage.dll | 3072 | 8,00% |
| System.Threading.Overlapped.dll | 3072 | 28,57% |
| System.Security.Claims.dll | 2560 | 5,32% |
| Microsoft.VisualBasic.dll | 2048 | 1,05% |
| System.Collections.Concurrent.dll | 2048 | 2,03% |
| System.Collections.NonGeneric.dll | 2048 | 4,44% |
| System.Diagnostics.TraceSource.dll | 2048 | 4,08% |
| System.Diagnostics.Tracing.dll | 2048 | 11,11% |
| System.Runtime.InteropServices.RuntimeInformation.dll | 2048 | 16,00% |
| System.Threading.Tasks.Parallel.dll | 2048 | 4,17% |
| Microsoft.Win32.Primitives.dll | 1536 | 17,65% |
| System.Collections.Specialized.dll | 1536 | 3,66% |
| System.ComponentModel.Annotations.dll | 1536 | 1,94% |
| System.Diagnostics.FileVersionInfo.dll | 1536 | 10,71% |
| System.Reflection.DispatchProxy.dll | 1536 | 5,36% |
| System.Resources.Writer.dll | 1536 | 7,69% |
| System.Runtime.Serialization.Formatters.dll | 1536 | 1,10% |
| System.Threading.Thread.dll | 1536 | 6,82% |
| System.ComponentModel.EventBasedAsync.dll | 1024 | 5,71% |
| System.Drawing.Primitives.dll | 1024 | 2,30% |
| System.IO.Compression.ZipFile.dll | 1024 | 6,90% |
| System.Linq.dll | 1024 | 0,69% |
| System.Linq.Queryable.dll | 1024 | 1,60% |
| System.Net.ServicePoint.dll | 1024 | 6,25% |
| System.ObjectModel.dll | 1024 | 2,63% |
| System.Runtime.InteropServices.dll | 1024 | 4,17% |
| System.Runtime.Numerics.dll | 1024 | 1,41% |
| System.Runtime.Serialization.Primitives.dll | 1024 | 7,69% |
| System.Security.Cryptography.Primitives.dll | 1024 | 2,41% |
| System.AppContext.dll | 512 | 8,33% |
| System.Collections.Immutable.dll | 512 | 0,26% |
| System.Diagnostics.DiagnosticSource.dll | 512 | 1,69% |
| System.Diagnostics.TextWriterTraceListener.dll | 512 | 4,35% |
| System.Globalization.Extensions.dll | 512 | 7,14% |
| System.Net.WebProxy.dll | 512 | 4,55% |
| System.Net.WebSockets.dll | 512 | 2,50% |
| System.Numerics.Vectors.dll | 512 | 0,32% |
| System.Reflection.Primitives.dll | 512 | 7,14% |
| System.Reflection.TypeExtensions.dll | 512 | 3,57% |
| System.Runtime.dll | 512 | 1,43% |
| System.Security.Cryptography.OpenSsl.dll | 512 | 6,25% |
| System.Xml.XmlSerializer.dll | 512 | 5,56% |
| System.Xml.XPath.XDocument.dll | 512 | 6,67% |

Это очень простая проблема для нового участника. Просто откройте один из файлов htm и удалите источники, отмеченные красным.

Сразу бросается в глаза то, что сгенерированный класс SR почти всегда имеет несколько членов, которые не используются, и он присутствует во всех (или, по крайней мере, в большинстве) наших сборок. Это может дать нам несколько простых глобальных улучшений, если мы выясним, как это исправить.

Я также вижу, что в некоторых случаях отображаются поля private const . Они используются реализацией этого класса, но, очевидно, не видны и не используются снаружи. Вероятно, не стоит пытаться «исправить» эти проблемы.

Если реализация класса, использующая поля private const , доступна через точку входа, видимую за пределами сборки, поля не удаляются.

Предположительно, если какая-либо библиотека имеет видимые внутренние компоненты (например, для модульных тестов), мы увидим ложные срабатывания, верно?

Если в сборке есть InternalsVisibleTo, то все внутренние элементы также считаются корневыми.

В ПОРЯДКЕ. Я думаю, что есть несколько случаев, когда тесты используют отражение, чтобы получить внутренности. Но они будут быстро обнаружены, когда мы проведем тесты.

@mellinoe

Сразу бросается в глаза то, что сгенерированный класс SR почти всегда имеет несколько членов, которые не используются, и он присутствует во всех (или, по крайней мере, в большинстве) наших сборок. Это может дать нам несколько простых глобальных улучшений, если мы выясним, как это исправить.

Я уже сделал проход в феврале, удалив 100 мертвых строк. Останутся очень немногие. Я думаю, что это случаи, когда метод, который ссылается на строку, сам обрезается. В этом случае, конечно, resx необходимо обрезать.

@danmosemsft Я имею в виду этот блок членов, который всегда создается в сгенерированном файле:

C# internal static string Format(string resourceFormat, object p1); internal static string Format(string resourceFormat, object p1, object p2); internal static string Format(string resourceFormat, object p1, object p2, object p3); internal static string Format(string resourceFormat, params object[] args);

Часто (по крайней мере, из моего краткого просмотра 😄) используется только первое, а иногда и второе. В некоторых из тех, которые я щелкнул, это был самый большой фрагмент разницы.

В ПОРЯДКЕ. Я думаю, что есть несколько случаев, когда тесты используют отражение, чтобы получить внутренности. Но они будут быстро обнаружены, когда мы проведем тесты.

Я уже рассмотрел большинство из них: https://github.com/dotnet/corefx/pull/17825/commits/2277db969616a5ad4fd9f4a8118a3b4030ff62d3 .

Мы уже очистили внутреннюю и внешнюю петлю.

В отчете Dataflow говорится, что типы в пространстве имен System.Threading.Tasks.Dataflow.Internal.Threading мертвы. Это неправда, в конфигурации по умолчанию они мертвы, но есть и другие конфигурации, в которых они используются. См. https://github.com/dotnet/corefx/pull/17912 для моего предложенного изменения.

Возможно, есть и другие подобные типы? Нужно ли что-то с ними делать?

Этот отчет предназначен только для NETCoreApp в Windows. Возможно, что они все еще используются в другой конфигурации, и это будет обнаружено сборкой -allConfigurations, если кто-то попытается полностью их удалить. В таких случаях вы можете улучшить конфигурацию NETCoreApp, определяя/разделяя источник, как я упоминал в пункте 2 выше. Это похоже на то, что вы делаете в dotnet/corefx#17912.

Если вы заинтересованы в определении diff для других конфигураций, где мы не используем компоновщик, вы можете включить его, используя сведения, которые я перечислил в разделе фона. Это будет проще, когда PR будет объединен, так что вы можете просто подождать.

@erozenfeld Мы не хотим удалять какие-либо константы просто потому, что они встроены компилятором, потому что это теряет ясность кода. Но некоторые константы действительно мертвы, и мы, вероятно, хотим удалить их.

Например, в http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.TypeConverter.diff.html весь VSStandardCommands помечен как мертвый. Некоторые видны (через public class StandardCommands ) и просто встроены. Но некоторые действительно мертвы, например, cmdidThisWindow

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

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

Он также помечает как мертвые любые закрытые конструкторы по умолчанию, которые мы не хотим удалять, как правило, поскольку они существуют, чтобы предотвратить любую случайную конструкцию без параметров. Я предполагаю, что это неизбежно по той же причине. Насколько я могу думать, у них нет никакой цели после времени компиляции.

Отметить как «легкий» в соответствии с приведенным выше обсуждением. Я планирую указать несколько новых участников этого выпуска.

Если кто ковыряет файл, просьба так и сказать по этому вопросу, во избежание дублирования работы.

@danmosemsft , вы также хотите добавить сюда свои инструкции, которые вы отправляли продавцам? Может быть, было бы лучше добавить его в топ-пост со всеми исключениями / вещами, которых следует избегать ...

@karelz сделано

Я бегло посмотрел на диффы. В них слишком много шума - мне сложно было найти что-то простое и действенное. Можем ли мы отфильтровать шум от различий (константы, закрытые конструкторы без параметров, ...), чтобы в нем были только простые действия?

Вы можете открыть CSV-файлы и применить любой фильтр, который вам нравится.

Было бы неплохо повозиться с основным CSV, чтобы увидеть, какой код в /src/common на самом деле мертв.

@erozenfeld Я могу что-то здесь упустить. в http://tempcoverage.blob.core.windows.net/report2/System.Reflection.DispatchProxy.diff.html говорится, что EventAccessorInfo.InterfaceRaiseMethod мертв, но он установлен в конструкторе, который сам по себе не мертвых.
https://github.com/dotnet/corefx/blob/master/src/System.Reflection.DispatchProxy/src/System/Reflection/DispatchProxyGenerator.cs#L919

удалить ненужное и легкое, я не думаю, что оно готово (не стесняйтесь меняться, если вы думаете, что я ошибаюсь)

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

Что-то еще он неправильно помечает мертвыми: строки, которые загружаются во время выполнения через SR.GetResourceString("..."). К сожалению, есть еще некоторые, например, return SR.GetResourceString("PropertyCategory" + value, null);

Это должно быть поймано при проверке кода.

При беглом просмотре ветки показалось, что в результатах есть опасения по поводу шума. Опять же, я не чувствую себя сильно - смело переворачивайте его обратно ;-)

Все в порядке :)

В System.Transactions.Local есть код, к которому в настоящее время нет доступа, но некоторая его часть в конечном итоге будет доступна, как только мы выполним работу по поддержке распределенных транзакций. Я сдержан, чтобы просто удалить этот код.

Я уже удалил некоторый мертвый код, указанный здесь, в Microsoft.CSharp и еще несколько (анализ не выявил, что, например, ExpressionBinder.BindPtrToArray мертв в соответствии с dotnet/corefx#17948), а остальное находится в моем прицелы в рамках моего текущего рефакторинга этой сборки.

@danmosemsft Относительно EventAccessorInfo.InterfaceRaiseMethod: он говорит, что get_InterfaceRaiseMethod мертв, и, поскольку set_InterfaceRaiseMethod отсутствует, свойство мертво. Код в конструкторе задает сгенерированное компилятором вспомогательное поле.k__BackingField и ILLink сохраняют поле.

@jimcarley , это имеет смысл, я проверил S.Transactions.Local выше, как сделано. Я предполагаю, что если есть какие-то разногласия, которые на самом деле мертвы, вы, возможно, захотите удалить их в какой-то момент.

@JonHanna , если вы считаете, что ILLink должен был определить, что код мертв, я бы сообщил @erozenfeld .

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

@danmosemsft @JonHanna ILLink не пытается найти недостижимый код внутри методов. Если метод достижим, предполагается, что все инструкции il внутри метода достижимы.

На благо других: в автономном режиме возник еще один случай, когда поле int назначалось конструктором, который был помечен как мертвый. Однако это поле читалось в другом месте, и как только этот конструктор был удален, компилятор предупредил, что поле никогда не устанавливается. Читатель читал значение по умолчанию. В таком случае поле необходимо явно инициализировать при удалении мертвого сеттера.

@erozenfeld этот код выглядит мертвым: https://github.com/dotnet/corefx/compare/master...danmosemsft :dead.xml?expand=1
но не был помечен как мертвый. Это в IL (поля в структуре). ILLink специально избегает удаления полей из структур, например, в случае, если они используются во взаимодействии?

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

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

Ах - конечно.

Я заметил их, поскольку они были в https://github.com/dotnet/corefx/pull/18395/files .. другие находки там есть различные константы, которые мертвы (что, конечно, ILLink не может сказать, поскольку он показывает все константы как мертвый) и некоторые вещи, такие как инициализация, которые только человек может сказать, не имеют побочных эффектов. Ничего такого, что ILLink должен был найти.

@huanwu инструмент SGEN имеет 400 КБ мертвого кода.
Разумно ли все это удалить или это работа в процессе, вы собираетесь использовать этот код?

См. http://tempcoverage.blob.core.windows.net/report2/Microsoft.XmlSerializer.Generator.diff.html .

В System.Linq и System.Linq.Queryable единственный помеченный код — это либо используемые константы, либо методы в общих файлах, где в этом проекте используются другие методы того же класса, поэтому они не требуют дальнейшей работы.

Я только что обнаружил мертвый код с помощью написанного мной инструмента — см . https://github.com/dotnet/corefx/pull/18395. Я использую ваш код в качестве входных данных для проверки своего кода.

В прошлом я выполнял массовое удаление Roslyn (18,5 тыс. байтов), которое хорошо определяло код, который не должен быть мертвым — см. комментарии на https://github.com/dotnet/roslyn/pull/17630. т.е. используется только в отладчике, из-за регрессионной, неполной реализации тестов, должен быть условно скомпилирован.

@JonHanna, спасибо! Верхний пост обновлен вашей информацией.

dotnet/corefx#18414 удалил большую часть соответствующего мертвого кода в S.Linq.Expressions. Помимо констант и т. д., есть еще некоторые, которые могут стать актуальными, если в настоящее время неподдерживаемые функции будут перенесены (в том числе одна с проблемой, требующей именно этого), поэтому, вероятно, лучше не делать этого сейчас.

Звучит хорошо, он отмечен в списке. Большинству остальных требуется только минимальная очистка. SGEN является основным исключением ( @huanwu см. вопрос выше)

@zhenlan вопрос выше о Microsoft.XmlSerializer.Generator.dll - в нем 400 КБ мертвого кода (!) ... этот код временно мертв, или вы закончили эту работу, и кто-то может ее удалить? Я могу попросить поставщиков сделать большую часть работы, скорее всего. Просто дай мне знать.

@danmosemsft Это не мертвый код. Большая часть кода используется совместно с System.Private.Xml. Если вы проверите файл проекта https://github.com/dotnet/corefx/blob/master/src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj , вы обнаружите, что большинство файлов кода находятся в $(SourceDir)SystemXmlСериализация

@huanwu , даже если мы не можем удалить код из репо (потому что он используется другими), если код не используется в этой сборке, в идеале мы не будем компилировать его в сборку.
ReflectionAwareCodeGen
XmlSerializationWriterCodeGen
XmlSerializationCodeGen
все кажутся мертвыми классами. В идеале их можно было бы переместить в свои собственные файлы кода, чтобы они компилировались только там, где они необходимы.

ReflectionAwareCodeGen на самом деле находится в пределах #if XMLSERIALIZERGENERATOR , поэтому, возможно, он полностью мертв, если он мертв в этой сборке.

Также подавляющее большинство строк не используются в этом двоичном файле.

Если этот код мертв в этой сборке, это сэкономит 400 КБ, так что это стоит сделать.

Привет @danmosemsft , я может не совсем понимаю, как определяется мертвый код, но что-то не так.

Например, в файле различий Microsoft.XmlSerializer.Generator ReflectionAwareCodeGen отмечен красным цветом, что я интерпретировал как мертвый код с точки зрения инструментов. Однако здесь он явно используется в Microsoft.XmlSerializer.Generator . Не могли бы вы помочь прояснить?

Хорошо, я вижу, что инструмент фактически пометил всю цепочку *CodeGen как мертвый код. Пожалуйста, проигнорируйте мой предыдущий вопрос и позвольте мне объяснить. Проект Microsoft.XmlSerializer.Generator только что прошел первоначальную регистрацию. Некоторый код мертв только временно. Они будут использованы, когда у нас будет больше работы. Может быть, мы сможем снова запустить инструмент, когда код будет готов?

@zhenlan это именно то, что я предполагал. На самом деле завершение кода было на прошлой неделе :) Возможно, это DCR. Много ли еще предстоит сделать?

@danmosemsft да, то, что вы предположили, верно :)

Microsoft.XmlSerializer.Generator (Sgen) — это инструмент командной строки, который не входит в состав .NET Core. Что касается части кода, который Sgen разделяет с S.Private.Xml, я не думаю, что есть какие-то большие пробелы, кроме исправлений ошибок, и мы нацелены на 5/10 для ZBB. Для той части кода, которая находится исключительно под Sgen, нужно сделать больше функций, но у нас должно быть больше свободы действий из-за разных средств выпуска. Надеюсь, это прояснит.

@erozenfeld большая часть оставшегося удаляемого кода, вероятно, является частью общих общих файлов, которые никто не использует. Без анализа каждого вручную или выполнения какого-либо утомительного соединения CSV невозможно очистить этот код. Есть ли какой-то простой способ запустить ILLink для всего набора сборок, объединив файлы, которые используются в нескольких сборках, чтобы мы могли получить один из этих HTML-отчетов, показывающий, что не работает в общем коде?

Мы также хотели бы объединить тестовые сборки, поскольку некоторые тесты компилируются в коде продукта (например, PathInternal.cs). Также Unix, потому что они, конечно, используют общий код.

@danmosemsft Мой инструмент может это сделать. т.е. запускать его на всей базе кода, автоматически удаляя строки, включая ложные срабатывания, многократно создавать и возвращать, а затем тестировать. Наконец, загрузите его в мою учетную запись Github и создайте запрос на включение. Вероятно, требуется довольно много работы, поэтому не следует пытаться, если она не будет использоваться. См. https://github.com/dotnet/corefx/pull/18395 для получения результатов по подмножеству.

@danmosemsft

Есть ли какой-то простой способ запустить ILLink для всего набора сборок, объединив файлы, которые используются в нескольких сборках, чтобы мы могли получить один из этих HTML-отчетов, показывающий, что не работает в общем коде?

Нет, нет прямого способа сделать это. ILLink работает со сборками, а не с исходными файлами, которые использовались для их создания.

@erozenfeld Не думаю, что я это имел в виду. Я не ожидаю, что ILLink будет работать с источниками. Но прямо сейчас любые общие источники, которые он показывает как мертвые в двоичном файле X, не могут быть легко удалены, потому что они могут использоваться двоичными файлами Y или Z. Если условно все наши библиотеки были скомпилированы в одну большую dll, такую ​​как ILMerge или что-то подобное, запущенное, с соответствующим исправлением pdb мы могли бы удалить любой общий код, который оказался мертвым. Мой вопрос заключался в том, может ли ILMerge объединить сборки в одну, а затем выполнить анализ замыкания этой сборки.

@danmosemsft Нет, ILLink не может объединять сборки в одну, как это делает ILMerge. Я не знаю, как ILMerge справляется с конфликтующими именами в сборках. Если у вас есть класс NC в сборке A и класс NC в сборке B, в общем случае вам нужно сохранить оба (и переименовать один или оба) при слиянии, если вы не можете доказать, что они идентичны в глубоком смысле.

Попался. Ну, может быть, подход появится в будущем. Это не имеет большого значения.

Мне также приходит в голову, что это можно сделать с некоторой обработкой CSV...

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

В System.Collections.Immutable и System.Collections.NonGeneric единственный помеченный код — это используемые константы или методы в общих файлах, где в этом проекте используются другие методы того же класса, поэтому они не требуют дальнейшей работы.

Спасибо @YoupHulsebos , верхний пост обновлен.

В System.IO.FileSystem.Watcher и System.Security.Cryptography.Primitives единственный помеченный код — это используемые константы или методы в общих файлах, где в этом проекте используются другие методы того же класса, поэтому они не требуют дальнейшей работы.

@yaelkeemink спасибо обновленные флажки.

Привет,
Как новый участник, я хотел бы заняться библиотекой System.Net.Mail , если это нормально!

Конечно, спасибо! Вперед, продолжать. Если вы столкнетесь с какими-либо препятствиями, отправьте нам сообщение о новых проблемах файла (и отметьте меня для маршрутизации).

Я создал запрос на перенос для System.Net.Mail и подписал соглашение.

Спасибо @Эрмиар! Топ-выпуск обновлен со ссылкой на PR.

Новичок здесь - я возьму следующее:

System.IO.FileSystem.DriveInfo
System.IO.FileSystem.Watcher

🗄

Отлично, добро пожаловать на борт @garfbradaz!
Дайте нам знать, когда вы отправите PR, мы обновим верхний пост ( @ViktorHofer , не могли бы вы помочь сегодня?)

Конечно.

@garfbradaz , пожалуйста, убедитесь, что после удаления возможного мертвого кода все тесты выполняются как в проектах для рабочего стола, так и в Core.
Вы можете сделать это, сначала запустив:
build.cmd и build.cmd -framework:netfx из корня corefx и после этого запустив отдельные тестовые проекты следующим образом:
msbuild /t:RebuildAndTest и msbuild /t:RebuildAndTest /p:TargetGroup=netfx .

Не стесняйтесь обращаться ко мне, если вам нужна помощь. Спасибо за вашу помощь!

Спасибо @ViktorHofer / @karelz - медленно продираюсь

Было ложное срабатывание: dotnet/corefx#19826 реализован с кодом, удаленным фиксацией 81506698 по этой проблеме. Хотя этот метод на данный момент «мертв», важно быть там, чтобы вернуть DbProviderFactories из .NET в полном объеме. Таким образом, он будет восстановлен, если PR dotnet/corefx#19826 будет объединен.

Первый участник, я хотел бы попробовать System.Linq.Expressions.

Отлично @mccbraxton! Если вам нужна помощь, пингуйте меня.

@mccbraxton Кажется, System.Linq.Expressions уже очищена. Хочешь взять еще кусок?

@ViktorHofer Вы правы - должно быть, неправильно прочитали. Как насчет System.Security.Cryptography.Algorithms?

Выглядит неплохо! Я добавил вас в таблицу. Убедитесь, что вы не удалили код, который используется какой-либо целью. Спасибо за вашу помощь!

dotnet/corefx#18162 позаботился о том, что осталось в отчете для действительно мертвого Microsoft.CSharp.

Привет, новый вкладчик, я могу взять System.ComponentModel.*

Спасибо @norek , дерзайте.

Привет, ниже сводка System.ComponentModel.

  • корень - нечего удалять
  • .Аннотации - удалять нечего
  • .EventBasedAsync — удалять нечего
  • .Primitives - помечен как мертвый, но это не так.
  • .TypeConverters — убрал часть кода. Но меня смущает оператор != - он помечен как мертвый, но я не знаю всех ваших соглашений по кодированию - тоже нужно удалить?

Я просматривал список и нашел мертвый код в System.Diagnostics - StackTraceSymbols помечен как мертвый, но имя этого класса в обозревателе решений - StackTraceSymbols.CoreCLR.cs . Я нашел в закрытых выпусках: dotnet/corefx#19368
а он умер или нет?

@ mikem8361 у вас есть SDStackTraceSymbols?

Я владею им, и это не мертвый код. Отражение используется System.Private.CoreLib для загрузки этой сборки и ссылки на этот класс.

Таким образом, coreclr может печатать информацию о номере источника/строки в трассировках стека необработанных исключений.

@ mikem8361 спасибо за информацию. Похоже, он защищен illinktrim.xml:

<linker>
  <assembly fullname="System.Diagnostics.StackTrace">
    <!-- used by System.Private.CoreLib StackTrace code to load portable pdbs for the runtime diagnostic stack trace to get source/line info -->
    <type fullname="System.Diagnostics.StackTraceSymbols" required="true" />
  </assembly>
</linker>

@ericsstj @erozenfeld можем ли мы исправить CSV-файл, который выдает ILLink, чтобы он не отображал код как мертвый , когда мы заставили его сохранить код?

CSV-файлы, которые у нас есть, представляют собой просто разницу после обрезки, поэтому в них нет явных корневых элементов. Данные, связанные с этой проблемой, недействительны. Это из разового тиража, когда я открывал выпуск. Я подозреваю, что если вы посмотрите на живую информацию, она больше не будет отображаться как diff.

Привет, я первый раз вкладчик. Я хотел бы попробовать System.Net.Http и System.Net.HttpListener.

@soapdogg дерзай ..

@AlexGhiondea , как уже упоминалось

Привет. Могу я взять Microsoft.VisulaBasic ?

@satano конечно, давай. Похоже, что нужно удалить всего несколько битов (все константные поля и ctor без параметров не должны оставаться, согласно моей записи выше). Возможно, вы могли бы сделать и CSharp?

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

Хорошо, я сделаю CSharp и VisualBasic.

PR для Microsoft.VisualBasic готов.

По поводу Microsoft.CSharp - все красное в diff файле уже удалено. Так что просто отметьте это в задаче.

Мы собираемся оставить этот вопрос для новичков, или я могу продолжить?

@satano , не могли бы вы найти изменение, которое удалило красный дифференциал?
Можно продолжать, мы не оставляем это только для новичков.

Не знаю, все ли было, но кое-что убрали здесь: https://github.com/dotnet/corefx/commit/3eb339702e2fcdf924b50c2e32d7e9e02395e52f

@JonHanna даже сказал это здесь https://github.com/dotnet/corefx/issues/17905#issuecomment -291924301

Я продолжу сверху. Итак, далее я возьму System.IO.Compression , System.IO.FileSystem.AccessControl и System.IO.FileSystem .

@satano дерзайте - не нужно спрашивать разрешения, если бы кто-то еще искал, он бы написал здесь.

Одна интересная «метапроблема» для кого-то заключается в том, есть ли способ использовать тот же инструмент компоновщика для поиска общего кода, который никто не использует. Если класс, извлеченный из srccommon, используется библиотекой лишь частично, в этом анализе он будет отображаться мертвым, но его нельзя будет удалить, поскольку другая библиотека может получить его и использовать. Я думал, что если есть способ объединить сборки, а затем запустить на них компоновщик. @erozenfeld , можем ли мы использовать компоновщик для слияния, а затем найти мертвый код в результате?

В настоящее время ILLink не может объединять сборки. Это то, что мы планируем добавить в будущем. Есть и другие инструменты, которые могут это сделать: https://github.com/Microsoft/ILMerge и https://github.com/gluck/il-repack , хотя я не уверен, что они справляются с этим сценарием так, как мы хотим. Они могут осознавать или не осознавать, что типы/методы/поля с конфликтующими именами представляют идентичные сущности.

Я продолжаю с System.Net.Http , System.Net.HttpListener и System.Net.NetworkInformation .

Я возьму все System.Net.* по одному.

Продолжаем с остальными: System.Private.* , System.Runtime.* и System.Security.* .

@карелз

… не могли бы вы найти изменение, которое убрало красный дифференциал?

дотнет/corefx#18162

Что ж... Наверное, пора пересмотреть этот вопрос и, может быть, закрыть его?

Мертвый код из этих проектов был удален и объединен:

  • Microsoft.CSharp (уже сделано ранее, как указано в комментарии выше)
  • Microsoft.VisualBasic
  • System.IO.Compression
  • System.IO.FileSystem
  • System.IO.FileSystem.AccessControl
  • Система.Net.Http
  • System.Net.HttpListener
  • System.Net.NetworkInformation
  • System.Net.Primitives
  • System.Net.Requests
  • Система.Net.Security
  • System.Net.Sockets
  • System.Net.WebClient
  • System.Net.WebSocket.Client
  • Сериализация System.Private.DataContract
  • System.Private.Uri
  • Система.Безопасность.Криптография.Cng
  • Система.Безопасность.Криптография.Csp

Посмотрел и остальные проекты и в них делать нечего:

  • System.Net.WebHeaderCollection
  • System.Net.WebSockets
  • Система.Время выполнения
  • System.Runtime.Serialization.Primitives
  • Система.Безопасность.AccessControl
  • System.Security.Claims
  • Система.Безопасность.Криптография.Алгоритмы
  • Система.Безопасность.Криптография.Кодирование
  • Система.Безопасность.Криптография.OpenSsl

Таким образом, единственный оставшийся проект — это Microsoft.XmlSerializer.Generator . У него большая часть мертвого кода, но, как упоминалось в некоторых комментариях здесь, там ведется работа — насколько я понял.

Этот вопрос завершен? Если нет, могу ли я взять System.Console ?

@ Iroca88 конечно. Обратите внимание, что приведенные выше дампы могут быть немного устаревшими.

Спасибо @danmosemsft , есть предложения по получению новых дампов? В противном случае я начну с приведенных выше дампов.

Кстати: это @lroca88 , я сделал первую букву (L) заглавной, чтобы избежать путаницы :)

@ Lroca88 в верхнем посте объясняется, как получить доступ к обрезанным и предварительно обрезанным сборкам. Чтобы различить их, мы использовали инструмент, который не является общедоступным. Вы можете использовать декомпилятор, такой как Ilspy On, и выполнять текстовое сравнение результатов. Это, вероятно, сработает.

Я проведу недавний diff и поделюсь им. Быть в курсе.

Вот последние:

  • [ ] [Microsoft.CSharp](http://tempcoverage.blob.core.windows.net/report3/Microsoft.CSharp.diff.html) ( csv )
  • [ ] [Microsoft.VisualBasic](http://tempcoverage.blob.core.windows.net/report3/Microsoft.VisualBasic.diff.html) ( csv )
  • [ ] [Microsoft.Win32.Primitives](http://tempcoverage.blob.core.windows.net/report3/Microsoft.Win32.Primitives.diff.html) ( csv )
  • [ ] [Microsoft.Win32.Registry](http://tempcoverage.blob.core.windows.net/report3/Microsoft.Win32.Registry.diff.html) ( csv )
  • [ ] [System.Collections.Concurrent](http://tempcoverage.blob.core.windows.net/report3/System.Collections.Concurrent.diff.html) ( csv )
  • [ ] [System.Collections](http://tempcoverage.blob.core.windows.net/report3/System.Collections.diff.html) ( csv )
  • [ ] [System.Collections.Immutable](http://tempcoverage.blob.core.windows.net/report3/System.Collections.Immutable.diff.html) ( csv )
  • [ ] [System.Collections.NonGeneric](http://tempcoverage.blob.core.windows.net/report3/System.Collections.NonGeneric.diff.html) ( csv )
  • [ ] [System.Collections.Specialized](http://tempcoverage.blob.core.windows.net/report3/System.Collections.Specialized.diff.html) ( csv )
  • [ ] [System.ComponentModel.Annotations](http://tempcoverage.blob.core.windows.net/report3/System.ComponentModel.Annotations.diff.html) ( csv )
  • [ ] [System.ComponentModel](http://tempcoverage.blob.core.windows.net/report3/System.ComponentModel.diff.html) ( csv )
  • [ ] [System.ComponentModel.EventBasedAsync](http://tempcoverage.blob.core.windows.net/report3/System.ComponentModel.EventBasedAsync.diff.html) ( csv )
  • [ ] [System.ComponentModel.Primitives](http://tempcoverage.blob.core.windows.net/report3/System.ComponentModel.Primitives.diff.html) ( csv )
  • [ ] [System.ComponentModel.TypeConverter](http://tempcoverage.blob.core.windows.net/report3/System.ComponentModel.TypeConverter.diff.html) ( csv )
  • [ ] [System.Console](http://tempcoverage.blob.core.windows.net/report3/System.Console.diff.html) ( csv )
  • [ ] [System.Data.Common](http://tempcoverage.blob.core.windows.net/report3/System.Data.Common.diff.html) ( csv )
  • [ ] [System.Diagnostics.DiagnosticSource](http://tempcoverage.blob.core.windows.net/report3/System.Diagnostics.DiagnosticSource.diff.html) ( csv )
  • [ ] [System.Diagnostics.FileVersionInfo](http://tempcoverage.blob.core.windows.net/report3/System.Diagnostics.FileVersionInfo.diff.html) ( csv )
  • [ ] [System.Diagnostics.Process](http://tempcoverage.blob.core.windows.net/report3/System.Diagnostics.Process.diff.html) ( csv )
  • [ ] [System.Diagnostics.StackTrace](http://tempcoverage.blob.core.windows.net/report3/System.Diagnostics.StackTrace.diff.html) ( csv )
  • [ ] [System.Diagnostics.TextWriterTraceListener](http://tempcoverage.blob.core.windows.net/report3/System.Diagnostics.TextWriterTraceListener.diff.html) ( csv )
  • [ ] [System.Diagnostics.Tools](http://tempcoverage.blob.core.windows.net/report3/System.Diagnostics.Tools.diff.html) ( csv )
  • [ ] [System.Diagnostics.TraceSource](http://tempcoverage.blob.core.windows.net/report3/System.Diagnostics.TraceSource.diff.html) ( csv )
  • [ ] [System.Diagnostics.Tracing](http://tempcoverage.blob.core.windows.net/report3/System.Diagnostics.Tracing.diff.html) ( csv )
  • [ ] [System.Drawing.Primitives](http://tempcoverage.blob.core.windows.net/report3/System.Drawing.Primitives.diff.html) ( csv )
  • [ ] [System.IO.Compression.Brotli](http://tempcoverage.blob.core.windows.net/report3/System.IO.Compression.Brotli.diff.html) ( csv )
  • [ ] [System.IO.Compression](http://tempcoverage.blob.core.windows.net/report3/System.IO.Compression.diff.html) ( csv )
  • [ ] [System.IO.Compression.ZipFile](http://tempcoverage.blob.core.windows.net/report3/System.IO.Compression.ZipFile.diff.html) ( csv )
  • [ ] [System.IO.FileSystem.AccessControl](http://tempcoverage.blob.core.windows.net/report3/System.IO.FileSystem.AccessControl.diff.html) ( csv )
  • [ ] [System.IO.FileSystem](http://tempcoverage.blob.core.windows.net/report3/System.IO.FileSystem.diff.html) ( csv )
  • [ ] [System.IO.FileSystem.DriveInfo](http://tempcoverage.blob.core.windows.net/report3/System.IO.FileSystem.DriveInfo.diff.html) ( csv )
  • [ ] [System.IO.FileSystem.Watcher](http://tempcoverage.blob.core.windows.net/report3/System.IO.FileSystem.Watcher.diff.html) ( csv )
  • [ ] [System.IO.IsolatedStorage](http://tempcoverage.blob.core.windows.net/report3/System.IO.IsolatedStorage.diff.html) ( csv )
  • [ ] [System.IO.MemoryMappedFiles](http://tempcoverage.blob.core.windows.net/report3/System.IO.MemoryMappedFiles.diff.html) ( csv )
  • [ ] [System.IO.Pipes](http://tempcoverage.blob.core.windows.net/report3/System.IO.Pipes.diff.html) ( csv )
  • [ ] [System.Linq](http://tempcoverage.blob.core.windows.net/report3/System.Linq.diff.html) ( csv )
  • [ ] [System.Linq.Expressions](http://tempcoverage.blob.core.windows.net/report3/System.Linq.Expressions.diff.html) ( csv )
  • [ ] [System.Linq.Parallel](http://tempcoverage.blob.core.windows.net/report3/System.Linq.Parallel.diff.html) ( csv )
  • [ ] [System.Linq.Queryable](http://tempcoverage.blob.core.windows.net/report3/System.Linq.Queryable.diff.html) ( csv )
  • [ ] [System.Memory](http://tempcoverage.blob.core.windows.net/report3/System.Memory.diff.html) ( csv )
  • [ ] [System.Net.Http](http://tempcoverage.blob.core.windows.net/report3/System.Net.Http.diff.html) ( csv )
  • [ ] [System.Net.HttpListener](http://tempcoverage.blob.core.windows.net/report3/System.Net.HttpListener.diff.html) ( csv )
  • [ ] [System.Net.Mail](http://tempcoverage.blob.core.windows.net/report3/System.Net.Mail.diff.html) ( csv )
  • [ ] [System.Net.NameResolution](http://tempcoverage.blob.core.windows.net/report3/System.Net.NameResolution.diff.html) ( csv )
  • [ ] [System.Net.NetworkInformation](http://tempcoverage.blob.core.windows.net/report3/System.Net.NetworkInformation.diff.html) ( csv )
  • [ ] [System.Net.Ping](http://tempcoverage.blob.core.windows.net/report3/System.Net.Ping.diff.html) ( csv )
  • [ ] [System.Net.Primitives](http://tempcoverage.blob.core.windows.net/report3/System.Net.Primitives.diff.html) ( csv )
  • [ ] [System.Net.Requests](http://tempcoverage.blob.core.windows.net/report3/System.Net.Requests.diff.html) ( csv )
  • [ ] [System.Net.Security](http://tempcoverage.blob.core.windows.net/report3/System.Net.Security.diff.html) ( csv )
  • [ ] [System.Net.ServicePoint](http://tempcoverage.blob.core.windows.net/report3/System.Net.ServicePoint.diff.html) ( csv )
  • [ ] [System.Net.Sockets](http://tempcoverage.blob.core.windows.net/report3/System.Net.Sockets.diff.html) ( csv )
  • [ ] [System.Net.WebClient](http://tempcoverage.blob.core.windows.net/report3/System.Net.WebClient.diff.html) ( csv )
  • [ ] [System.Net.WebHeaderCollection](http://tempcoverage.blob.core.windows.net/report3/System.Net.WebHeaderCollection.diff.html) ( csv )
  • [ ] [System.Net.WebProxy](http://tempcoverage.blob.core.windows.net/report3/System.Net.WebProxy.diff.html) ( csv )
  • [ ] [System.Net.WebSockets.Client](http://tempcoverage.blob.core.windows.net/report3/System.Net.WebSockets.Client.diff.html) ( csv )
  • [ ] [System.Net.WebSockets](http://tempcoverage.blob.core.windows.net/report3/System.Net.WebSockets.diff.html) ( csv )
  • [ ] [System.Numerics.Vectors](http://tempcoverage.blob.core.windows.net/report3/System.Numerics.Vectors.diff.html) ( csv )
  • [ ] [System.ObjectModel](http://tempcoverage.blob.core.windows.net/report3/System.ObjectModel.diff.html) ( csv )
  • [ ] [System.Private.DataContractSerialization](http://tempcoverage.blob.core.windows.net/report3/System.Private.DataContractSerialization.diff.html) ( csv )
  • [ ] [System.Private.Uri](http://tempcoverage.blob.core.windows.net/report3/System.Private.Uri.diff.html) ( csv )
  • [ ] [System.Private.Xml](http://tempcoverage.blob.core.windows.net/report3/System.Private.Xml.diff.html) ( csv )
  • [ ] [System.Private.Xml.Linq](http://tempcoverage.blob.core.windows.net/report3/System.Private.Xml.Linq.diff.html) ( csv )
  • [ ] [System.Reflection.DispatchProxy](http://tempcoverage.blob.core.windows.net/report3/System.Reflection.DispatchProxy.diff.html) ( csv )
  • [ ] [System.Reflection.Metadata](http://tempcoverage.blob.core.windows.net/report3/System.Reflection.Metadata.diff.html) ( csv )
  • [ ] [System.Reflection.TypeExtensions](http://tempcoverage.blob.core.windows.net/report3/System.Reflection.TypeExtensions.diff.html) ( csv )
  • [ ] [System.Resources.Writer](http://tempcoverage.blob.core.windows.net/report3/System.Resources.Writer.diff.html) ( csv )
  • [ ] [System.Runtime.CompilerServices.VisualC](http://tempcoverage.blob.core.windows.net/report3/System.Runtime.CompilerServices.VisualC.diff.html) ( csv )
  • [ ] [System.Runtime](http://tempcoverage.blob.core.windows.net/report3/System.Runtime.diff.html) ( csv )
  • [ ] [System.Runtime.Extensions](http://tempcoverage.blob.core.windows.net/report3/System.Runtime.Extensions.diff.html) ( csv )
  • [ ] [System.Runtime.InteropServices](http://tempcoverage.blob.core.windows.net/report3/System.Runtime.InteropServices.diff.html) ( csv )
  • [ ] [System.Runtime.InteropServices.RuntimeInformation](http://tempcoverage.blob.core.windows.net/report3/System.Runtime.InteropServices.RuntimeInformation.diff.html) ( csv )
  • [ ] [System.Runtime.InteropServices.WindowsRuntime](http://tempcoverage.blob.core.windows.net/report3/System.Runtime.InteropServices.WindowsRuntime.diff.html) ( csv )
  • [ ] [System.Runtime.Numerics](http://tempcoverage.blob.core.windows.net/report3/System.Runtime.Numerics.diff.html) ( csv )
  • [ ] [System.Runtime.Serialization.Formatters](http://tempcoverage.blob.core.windows.net/report3/System.Runtime.Serialization.Formatters.diff.html) ( csv )
  • [ ] [System.Runtime.Serialization.Primitives](http://tempcoverage.blob.core.windows.net/report3/System.Runtime.Serialization.Primitives.diff.html) ( csv )
  • [ ] [System.Security.AccessControl](http://tempcoverage.blob.core.windows.net/report3/System.Security.AccessControl.diff.html) ( csv )
  • [ ] [System.Security.Claims](http://tempcoverage.blob.core.windows.net/report3/System.Security.Claims.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Algorithms](http://tempcoverage.blob.core.windows.net/report3/System.Security.Cryptography.Algorithms.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Cng](http://tempcoverage.blob.core.windows.net/report3/System.Security.Cryptography.Cng.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Csp](http://tempcoverage.blob.core.windows.net/report3/System.Security.Cryptography.Csp.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Encoding](http://tempcoverage.blob.core.windows.net/report3/System.Security.Cryptography.Encoding.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.OpenSsl](http://tempcoverage.blob.core.windows.net/report3/System.Security.Cryptography.OpenSsl.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Primitives](http://tempcoverage.blob.core.windows.net/report3/System.Security.Cryptography.Primitives.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.X509Certificates](http://tempcoverage.blob.core.windows.net/report3/System.Security.Cryptography.X509Certificates.diff.html) ( csv )
  • [ ] [System.Security.Principal](http://tempcoverage.blob.core.windows.net/report3/System.Security.Principal.diff.html) ( csv )
  • [ ] [System.Security.Principal.Windows](http://tempcoverage.blob.core.windows.net/report3/System.Security.Principal.Windows.diff.html) ( csv )
  • [ ] [System.Text.RegularExpressions](http://tempcoverage.blob.core.windows.net/report3/System.Text.RegularExpressions.diff.html) ( csv )
  • [ ] [System.Threading](http://tempcoverage.blob.core.windows.net/report3/System.Threading.diff.html) ( csv )
  • [ ] [System.Threading.Overlapped](http://tempcoverage.blob.core.windows.net/report3/System.Threading.Overlapped.diff.html) ( csv )
  • [ ] [System.Threading.Tasks.Dataflow](http://tempcoverage.blob.core.windows.net/report3/System.Threading.Tasks.Dataflow.diff.html) ( csv )
  • [ ] [System.Threading.Tasks.Parallel](http://tempcoverage.blob.core.windows.net/report3/System.Threading.Tasks.Parallel.diff.html) ( csv )
  • [ ] [System.Threading.Thread](http://tempcoverage.blob.core.windows.net/report3/System.Threading.Thread.diff.html) ( csv )
  • [ ] [System.Transactions.Local](http://tempcoverage.blob.core.windows.net/report3/System.Transactions.Local.diff.html) ( csv )
  • [ ] [System.ValueTuple](http://tempcoverage.blob.core.windows.net/report3/System.ValueTuple.diff.html) ( csv )
  • [ ] [System.Web.HttpUtility](http://tempcoverage.blob.core.windows.net/report3/System.Web.HttpUtility.diff.html) ( csv )
  • [ ] [System.Xml.XPath.XDocument](http://tempcoverage.blob.core.windows.net/report3/System.Xml.XPath.XDocument.diff.html) ( csv )

Круто, я боролся со старым списком! 🔨

@ Lroca88 обязательно прочитайте подсказки в верхнем посте о том, как сделать этот проход, чтобы не запутаться ..

Упс. Я пропустил два недавно потерянных бита в Microsoft.CSharp в dotnet/corefx#26491. Я получу это в ближайшее время.

В новом списке System.Runtime, System.Web.HttpUtility, System.Linq и System.Linq.Queryable есть только константы, которые на самом деле не мертвы, и некоторый общий код. В System.Linq.Expressions есть те и несколько элементов, используемых в представлениях отладки, и ресурсы, используемые с определенными константами компилятора, и поэтому их следует удалить, чтобы все эти пять можно было отметить.

Я объединил библиотеки, просмотренные @JonHanna , и те, которые я просмотрел, в список. Я буду обновлять список по мере возможности, если кто-то хочет добавить элементы в этот список, не стесняйтесь пинговать меня!

Библиотека | Рассмотрено | Статус
-- | -- | --
Microsoft.CSharp (CSV) | @ДжонХанна | дотнет/corefx#27104
Microsoft.VisualBasic (CSV) | @Lroca88 | Нечего удалять
Microsoft.Win32.Primitives (csv) | @Lroca88 | Нечего удалять
Microsoft.Win32.Registry (csv) | @Lroca88 | Нечего удалять
System.Collections.Concurrent (csv) | @Lroca88 | Нечего удалять
System.Collections (csv) | @Lroca88 | Нечего удалять
System.Runtime (csv) | @ДжонХанна | Нечего удалять
System.Web.HttpUtility (csv) | @ДжонХанна | Нечего удалять
System.Linq (CSV) | @ДжонХанна | Нечего удалять
System.Linq.Queryable (csv) | @ДжонХанна | Нечего удалять

Спасибо @Lroca88 !

Меня не удивляет, что осталось не так много мертвого кода. Однако, как отмечено выше, этот процесс не может определить, является ли код в srccommon мертвым (поскольку он может отображаться мертвым в одной сборке, но не в другой). Если вам интересно найти способ решить эту проблему, вы, вероятно, найдете больше мертвого кода. Например, может быть, можно ILMerge сборки, а затем запустить анализ мертвого кода на них. Или, может быть, будет проще опубликовать CSV-файлы, чтобы найти общий код, который мертв во всех них. @ericsstj у тебя есть идеи?

С удовольствием помогу @danmosemsft ,
Я согласен с вами, по поводу улучшения этого процесса, из моих обзоров наиболее помеченный код не мертв, либо является константой, либо часто используется в другой сборке, как вы ранее говорили. Глядя на эти ложные срабатывания, я считаю, что охота немного утомительна.

К сожалению, я не знаю, как выполнить ILMerge и анализ мертвого кода или постобработать CSV. Я готов учиться/сотрудничать, если вы, ребята, хотите провести некоторое время, обучая меня :)

Где мы с этим? Поддерживается ли ОП в курсе пройденных занятий или нам следует отказаться от этого комментария сейчас?

@MisinformedDNA -- используйте https://github.com/dotnet/corefx/issues/17905#issuecomment -365349091, пожалуйста

Я не знаю, как выполнить ILMerge и анализ мертвого кода или постобработать CSV. Я готов учиться/сотрудничать, если вы, ребята, хотите провести некоторое время, обучая меня :)

Я тоже не знаю, и мне придется подумать/поэкспериментировать. Прямо сейчас я полностью занят закрытием релиза 2.1, так что придется немного подождать 😺

Я написал скрипт для загрузки всех CSV-файлов, а затем отфильтровал только самые полезные из них. Я придумал 3942 вопроса/возможности.

Сейчас я намерен рассмотреть каждую из проблем и принять соответствующие меры. Вы можете следить за моим прогрессом и оставлять отзывы, если хотите, на странице https://github.com/MisinformedDNA/corefx/tree/clean-dead-code.

Отлично, с нетерпением жду этого @MisinformedDNA.

Я обнаружил проблему с анализом мертвого кода, которая либо указывает на проблему, либо на недостаток инструмента.

В отчете говорится, что следующее может быть удалено:

    Friend Enum vbErrors
        ObjNotSet = 91
        IllegalFor = 92
    End Enum

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

    ' Enum cannot be accessed, so Function cannot be hit
    ' But the dead code analysis did not show this as removable!!
    Friend Shared Function VbMakeIllegalForException() As System.Exception
        Return VbMakeExceptionEx(vbErrors.IllegalFor, GetResourceString(SR.ID92)) 
    End Function

    ' The chain continues:

    ' VbMakeIllegalForException() cannot be hit, so first "If" cannot be true, but the rest of the Function *could* still be hit
    Public Shared Function ForNextCheckObj(ByVal counter As Object, ByVal loopObj As Object, ByRef counterResult As Object) As Boolean
        Dim loopFor As ForLoopControl
        If loopObj Is Nothing Then
            Throw VbMakeIllegalForException()
        End If
        If counter Is Nothing Then
            Throw New NullReferenceException(GetResourceString(SR.Argument_InvalidNullValue1, "Counter"))
        End If
        loopFor = CType(loopObj, ForLoopControl)
        ... cut for brevity
    End Function

Логика привела меня к тому, что первое утверждение «если» никогда не бывает истинным. Но этот оператор «Если» является проверкой null , поэтому мы должны предположить, что кто-то передаст null и что для определения мертвого кода отсутствует случай. И если есть проблема (или больше) с определением мертвого кода, то один или несколько Enum могут не быть мертвым кодом в конце концов.

TLDR: сводка

Вопрос 1: Почему VbMakeIllegalForException не помечен для удаления, хотя он не может вызвать перечисление, которое было помечено для удаления.
Вопрос 2. Почему тестовые примеры при определении мертвого кода не передают нулевые значения для всех применимых параметров?

@ericsstj

Значения перечисления, вероятно, были встроены в msil, поэтому инструмент их не видит. То же верно и для констант. В этих случаях для исходного кода ничего делать не нужно.

Я только что закончил удаление мертвого кода для System.Data.Common с успешным завершением build.cmd src\System.Data.Common . До сих пор у меня сложилось впечатление, что мне нужно работать только в той библиотеке, в которой я был, и если сборка и тесты пройдены, то я готов к работе. Но я все равно решил сделать полную сборку, и я рад, что сделал это, потому что получил множество ошибок.

Вот несколько примеров ошибок:

SystemDataSqlClientSqlCommandBuilder.cs(277,17): ошибка CS0117: «ADP» не содержит определения для «RemoveStringQuotes» [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataProviderBaseDbConnectionPool.cs(984,33): ошибка CS0117: «ADP» не содержит определения для «SetCurrentTransaction» [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
D:ReposcorefxsrcCommonsrcSystemDataProviderBaseDbMetaDataFactory.cs(409,21): ошибка CS0117: «ADP» не содержит определения для «IsEmptyArray» [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataCommonDbConnectionStringCommon.cs(180,27): ошибка CS0117: «ADP» не содержит определения для «InvalidConnectionOptionValue» [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]

Все отсутствующие элементы были четко указаны для удаления в System.Data.Common.diff.html , но они не только вызывают ошибки в дочерних классах, но и нет файлов различий для этих дочерних классов или связанных сборок, таких как System.Data.SqlClient .

Первая ошибка, показанная выше, связана с общедоступным методом SqlCommandBuilder.UnquoteIdentifier . Поэтому я не понимаю, как ADP.RemoveStringQuotes можно удалить из System.Data.Common без внесения критических изменений в другие классы.

Как мне с этим справиться? Любые идеи, почему они помечаются для удаления?

@anipik можешь помочь @misinformeddna здесь?

@MisinformedDNA Вам всегда придется создавать весь репозиторий и запускать тесты для всех библиотек, потому что возможно, что одна библиотека может зависеть от другой библиотеки напрямую (A с использованием некоторого типа из B) или косвенно. (A использует какой-то тип из B, который использует какой-то тип из C)
В функции ADP.removeStringQuotes , isemptyarray , setTransaction нет ничего специфичного только для ApaterUtil или System.Data.Common, поэтому мы можем просто переместить ее в sqlCommandBuilder.cs как частный статический метод. Они просто манипулируют аргументами. Если бы вы могли указать мне на ветку, в которой произошел этот сбой, я мог бы помочь вам с другими сбоями.

Все методы, которые вы упомянули выше, - это internal static methods , которые больше не используются в сборке, в которой они определены.
Внутренние элементы обычно не предназначены для использования вне сборки, в которой они определены. но в некоторых случаях мы делаем это с помощью атрибута ``Internals Visible To```.

@danmosemsft перемещает эти внутренние функции в сборки, где они используются оптимально?

Вот форк, над которым я работаю: https://github.com/MisinformedDNA/corefx/tree/clean-dead-code

Как указывалось ранее, анализ мертвого кода говорит, что ADP.RemoveStringQuotes за System.Data.Common можно удалить. Однако, поскольку ADP был помечен как internal , анализатор мог предположить, что он не используется вне сборки. Я не уверен, что он ищет атрибут InternalsVisibleTo , но это не имело бы значения, потому что он здесь не используется. Вместо этого он передается через связанные файлы.

<Compile Include="$(CommonPath)\System\Data\Common\AdapterUtil.cs">
    <Link>System\Data\Common\AdapterUtil.cs</Link>
</Compile>

Я предполагаю, что анализатор видит разные классы ADP как отдельные, а не общие типы, поскольку они, по сути, дублируются. Таким образом, хотя удаление RemoveStringQuotes является правильным для System.Data.Common , это неправильно при рассмотрении других проектов, с которыми он связан.

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

Если у кого-то нет лучшего предложения, я начну добавлять эти методы обратно в код.

@MisinformedDNA я говорил об этом с @danmosemsft в автономном режиме. Другой возможный подход — сделать класс ADP частичным. И тогда вы можете переместить эти функции в эти библиотеки.

Я подал свой первый PR, но 2 сборки провалились. Оба сбоя сборки, похоже, указывают на тайм-аут. Какие действия я должен предпринять, чтобы решить эту проблему?

См. https://github.com/dotnet/corefx/pull/28795 .

Я посмотрю на System.Private.Uri

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

@ericsstj имеет ли смысл регенерировать данные, чтобы у нас было более четкое представление о том, где мы находимся с этим?

Запущено в следующих пространствах имен:

  • Система.Коллекции.Специализированные

    • Только 2 свойства CompatibleComparer, но файл в src/common и более широкое использование.

  • System.Diagnostics.DiagnosticSource
  • System.Diagnostics.FileVersionInfo
  • Система.Диагностика.Процесс
  • System.Diagnostics.StackTrace
  • System.Diagnostics.TextWriterTraceListener
  • Система.Диагностика.Инструменты
  • System.Diagnostics.TraceSource
  • Система.Диагностика.Трассировка

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

  • [ ] [Microsoft.CSharp](http://tempcoverage.blob.core.windows.net/report4/Microsoft.CSharp.diff.html) ( csv )
  • [ ] [Microsoft.VisualBasic](http://tempcoverage.blob.core.windows.net/report4/Microsoft.VisualBasic.diff.html) ( csv )
  • [ ] [Microsoft.Win32.Primitives](http://tempcoverage.blob.core.windows.net/report4/Microsoft.Win32.Primitives.diff.html) ( csv )
  • [ ] [Microsoft.Win32.Registry](http://tempcoverage.blob.core.windows.net/report4/Microsoft.Win32.Registry.diff.html) ( csv )
  • [ ] [System.Collections.Concurrent](http://tempcoverage.blob.core.windows.net/report4/System.Collections.Concurrent.diff.html) ( csv )
  • [ ] [System.Collections](http://tempcoverage.blob.core.windows.net/report4/System.Collections.diff.html) ( csv )
  • [ ] [System.Collections.Immutable](http://tempcoverage.blob.core.windows.net/report4/System.Collections.Immutable.diff.html) ( csv )
  • [ ] [System.Collections.NonGeneric](http://tempcoverage.blob.core.windows.net/report4/System.Collections.NonGeneric.diff.html) ( csv )
  • [ ] [System.Collections.Specialized](http://tempcoverage.blob.core.windows.net/report4/System.Collections.Specialized.diff.html) ( csv )
  • [ ] [System.ComponentModel.Annotations](http://tempcoverage.blob.core.windows.net/report4/System.ComponentModel.Annotations.diff.html) ( csv )
  • [ ] [System.ComponentModel](http://tempcoverage.blob.core.windows.net/report4/System.ComponentModel.diff.html) ( csv )
  • [ ] [System.ComponentModel.EventBasedAsync](http://tempcoverage.blob.core.windows.net/report4/System.ComponentModel.EventBasedAsync.diff.html) ( csv )
  • [ ] [System.ComponentModel.Primitives](http://tempcoverage.blob.core.windows.net/report4/System.ComponentModel.Primitives.diff.html) ( csv )
  • [ ] [System.ComponentModel.TypeConverter](http://tempcoverage.blob.core.windows.net/report4/System.ComponentModel.TypeConverter.diff.html) ( csv )
  • [ ] [System.Console](http://tempcoverage.blob.core.windows.net/report4/System.Console.diff.html) ( csv )
  • [ ] [System.Data.Common](http://tempcoverage.blob.core.windows.net/report4/System.Data.Common.diff.html) ( csv )
  • [ ] [System.Diagnostics.DiagnosticSource](http://tempcoverage.blob.core.windows.net/report4/System.Diagnostics.DiagnosticSource.diff.html) ( csv )
  • [ ] [System.Diagnostics.FileVersionInfo](http://tempcoverage.blob.core.windows.net/report4/System.Diagnostics.FileVersionInfo.diff.html) ( csv )
  • [ ] [System.Diagnostics.Process](http://tempcoverage.blob.core.windows.net/report4/System.Diagnostics.Process.diff.html) ( csv )
  • [ ] [System.Diagnostics.StackTrace](http://tempcoverage.blob.core.windows.net/report4/System.Diagnostics.StackTrace.diff.html) ( csv )
  • [ ] [System.Diagnostics.TextWriterTraceListener](http://tempcoverage.blob.core.windows.net/report4/System.Diagnostics.TextWriterTraceListener.diff.html) ( csv )
  • [ ] [System.Diagnostics.Tools](http://tempcoverage.blob.core.windows.net/report4/System.Diagnostics.Tools.diff.html) ( csv )
  • [ ] [System.Diagnostics.TraceSource](http://tempcoverage.blob.core.windows.net/report4/System.Diagnostics.TraceSource.diff.html) ( csv )
  • [ ] [System.Diagnostics.Tracing](http://tempcoverage.blob.core.windows.net/report4/System.Diagnostics.Tracing.diff.html) ( csv )
  • [ ] [System.Drawing.Primitives](http://tempcoverage.blob.core.windows.net/report4/System.Drawing.Primitives.diff.html) ( csv )
  • [x] [System.IO.Compression.Brotli](http://tempcoverage.blob.core.windows.net/report4/System.IO.Compression.Brotli.diff.html) ( csv )
  • [ ] [System.IO.Compression](http://tempcoverage.blob.core.windows.net/report4/System.IO.Compression.diff.html) ( csv )
  • [ ] [System.IO.Compression.ZipFile](http://tempcoverage.blob.core.windows.net/report4/System.IO.Compression.ZipFile.diff.html) ( csv )
  • [ ] [System.IO.FileSystem.AccessControl](http://tempcoverage.blob.core.windows.net/report4/System.IO.FileSystem.AccessControl.diff.html) ( csv )
  • [ ] [System.IO.FileSystem](http://tempcoverage.blob.core.windows.net/report4/System.IO.FileSystem.diff.html) ( csv )
  • [x] [System.IO.FileSystem.DriveInfo](http://tempcoverage.blob.core.windows.net/report4/System.IO.FileSystem.DriveInfo.diff.html) ( csv )
  • [ ] [System.IO.FileSystem.Watcher](http://tempcoverage.blob.core.windows.net/report4/System.IO.FileSystem.Watcher.diff.html) ( csv )
  • [ ] [System.IO.IsolatedStorage](http://tempcoverage.blob.core.windows.net/report4/System.IO.IsolatedStorage.diff.html) ( csv )
  • [ ] [System.IO.MemoryMappedFiles](http://tempcoverage.blob.core.windows.net/report4/System.IO.MemoryMappedFiles.diff.html) ( csv )
  • [x] [System.IO.Pipes](http://tempcoverage.blob.core.windows.net/report4/System.IO.Pipes.diff.html) ( csv )
  • [ ] [System.Linq](http://tempcoverage.blob.core.windows.net/report4/System.Linq.diff.html) ( csv )
  • [ ] [System.Linq.Expressions](http://tempcoverage.blob.core.windows.net/report4/System.Linq.Expressions.diff.html) ( csv )
  • [ ] [System.Linq.Parallel](http://tempcoverage.blob.core.windows.net/report4/System.Linq.Parallel.diff.html) ( csv )
  • [ ] [System.Linq.Queryable](http://tempcoverage.blob.core.windows.net/report4/System.Linq.Queryable.diff.html) ( csv )
  • [ ] [System.Memory](http://tempcoverage.blob.core.windows.net/report4/System.Memory.diff.html) ( csv )
  • [ ] [System.Net.Http](http://tempcoverage.blob.core.windows.net/report4/System.Net.Http.diff.html) ( csv )
  • [ ] [System.Net.HttpListener](http://tempcoverage.blob.core.windows.net/report4/System.Net.HttpListener.diff.html) ( csv )
  • [ ] [System.Net.Mail](http://tempcoverage.blob.core.windows.net/report4/System.Net.Mail.diff.html) ( csv )
  • [ ] [System.Net.NameResolution](http://tempcoverage.blob.core.windows.net/report4/System.Net.NameResolution.diff.html) ( csv )
  • [ ] [System.Net.NetworkInformation](http://tempcoverage.blob.core.windows.net/report4/System.Net.NetworkInformation.diff.html) ( csv )
  • [ ] [System.Net.Ping](http://tempcoverage.blob.core.windows.net/report4/System.Net.Ping.diff.html) ( csv )
  • [ ] [System.Net.Primitives](http://tempcoverage.blob.core.windows.net/report4/System.Net.Primitives.diff.html) ( csv )
  • [ ] [System.Net.Requests](http://tempcoverage.blob.core.windows.net/report4/System.Net.Requests.diff.html) ( csv )
  • [ ] [System.Net.Security](http://tempcoverage.blob.core.windows.net/report4/System.Net.Security.diff.html) ( csv )
  • [ ] [System.Net.ServicePoint](http://tempcoverage.blob.core.windows.net/report4/System.Net.ServicePoint.diff.html) ( csv )
  • [ ] [System.Net.Sockets](http://tempcoverage.blob.core.windows.net/report4/System.Net.Sockets.diff.html) ( csv )
  • [ ] [System.Net.WebClient](http://tempcoverage.blob.core.windows.net/report4/System.Net.WebClient.diff.html) ( csv )
  • [ ] [System.Net.WebHeaderCollection](http://tempcoverage.blob.core.windows.net/report4/System.Net.WebHeaderCollection.diff.html) ( csv )
  • [ ] [System.Net.WebProxy](http://tempcoverage.blob.core.windows.net/report4/System.Net.WebProxy.diff.html) ( csv )
  • [ ] [System.Net.WebSockets.Client](http://tempcoverage.blob.core.windows.net/report4/System.Net.WebSockets.Client.diff.html) ( csv )
  • [ ] [System.Net.WebSockets](http://tempcoverage.blob.core.windows.net/report4/System.Net.WebSockets.diff.html) ( csv )
  • [ ] [System.Numerics.Vectors](http://tempcoverage.blob.core.windows.net/report4/System.Numerics.Vectors.diff.html) ( csv )
  • [ ] [System.ObjectModel](http://tempcoverage.blob.core.windows.net/report4/System.ObjectModel.diff.html) ( csv )
  • [ ] [System.Private.DataContractSerialization](http://tempcoverage.blob.core.windows.net/report4/System.Private.DataContractSerialization.diff.html) ( csv )
  • [ ] [System.Private.Uri](http://tempcoverage.blob.core.windows.net/report4/System.Private.Uri.diff.html) ( csv )
  • [ ] [System.Private.Xml](http://tempcoverage.blob.core.windows.net/report4/System.Private.Xml.diff.html) ( csv )
  • [ ] [System.Private.Xml.Linq](http://tempcoverage.blob.core.windows.net/report4/System.Private.Xml.Linq.diff.html) ( csv )
  • [ ] [System.Reflection.DispatchProxy](http://tempcoverage.blob.core.windows.net/report4/System.Reflection.DispatchProxy.diff.html) ( csv )
  • [ ] [System.Reflection.Metadata](http://tempcoverage.blob.core.windows.net/report4/System.Reflection.Metadata.diff.html) ( csv )
  • [ ] [System.Reflection.TypeExtensions](http://tempcoverage.blob.core.windows.net/report4/System.Reflection.TypeExtensions.diff.html) ( csv )
  • [ ] [System.Resources.Writer](http://tempcoverage.blob.core.windows.net/report4/System.Resources.Writer.diff.html) ( csv )
  • [ ] [System.Runtime.CompilerServices.VisualC](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.CompilerServices.VisualC.diff.html) ( csv )
  • [ ] [System.Runtime](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.diff.html) ( csv )
  • [ ] [System.Runtime.Extensions](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.Extensions.diff.html) ( csv )
  • [ ] [System.Runtime.InteropServices](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.InteropServices.diff.html) ( csv )
  • [ ] [System.Runtime.InteropServices.RuntimeInformation](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.InteropServices.RuntimeInformation.diff.html) ( csv )
  • [ ] [System.Runtime.InteropServices.WindowsRuntime](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.InteropServices.WindowsRuntime.diff.html) ( csv )
  • [ ] [System.Runtime.Numerics](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.Numerics.diff.html) ( csv )
  • [ ] [System.Runtime.Serialization.Formatters](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.Serialization.Formatters.diff.html) ( csv )
  • [ ] [System.Runtime.Serialization.Primitives](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.Serialization.Primitives.diff.html) ( csv )
  • [ ] [System.Runtime.WindowsRuntime.UI.Xaml](http://tempcoverage.blob.core.windows.net/report4/System.Runtime.WindowsRuntime.UI.Xaml.diff.html) ( csv )
  • [ ] [System.Security.AccessControl](http://tempcoverage.blob.core.windows.net/report4/System.Security.AccessControl.diff.html) ( csv )
  • [ ] [System.Security.Claims](http://tempcoverage.blob.core.windows.net/report4/System.Security.Claims.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Algorithms](http://tempcoverage.blob.core.windows.net/report4/System.Security.Cryptography.Algorithms.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Cng](http://tempcoverage.blob.core.windows.net/report4/System.Security.Cryptography.Cng.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Csp](http://tempcoverage.blob.core.windows.net/report4/System.Security.Cryptography.Csp.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Encoding](http://tempcoverage.blob.core.windows.net/report4/System.Security.Cryptography.Encoding.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.OpenSsl](http://tempcoverage.blob.core.windows.net/report4/System.Security.Cryptography.OpenSsl.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Primitives](http://tempcoverage.blob.core.windows.net/report4/System.Security.Cryptography.Primitives.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.X509Certificates](http://tempcoverage.blob.core.windows.net/report4/System.Security.Cryptography.X509Certificates.diff.html) ( csv )
  • [ ] [System.Security.Principal](http://tempcoverage.blob.core.windows.net/report4/System.Security.Principal.diff.html) ( csv )
  • [ ] [System.Security.Principal.Windows](http://tempcoverage.blob.core.windows.net/report4/System.Security.Principal.Windows.diff.html) ( csv )
  • [ ] [System.Text.RegularExpressions](http://tempcoverage.blob.core.windows.net/report4/System.Text.RegularExpressions.diff.html) ( csv )
  • [ ] [System.Threading](http://tempcoverage.blob.core.windows.net/report4/System.Threading.diff.html) ( csv )
  • [ ] [System.Threading.Overlapped](http://tempcoverage.blob.core.windows.net/report4/System.Threading.Overlapped.diff.html) ( csv )
  • [ ] [System.Threading.Tasks.Dataflow](http://tempcoverage.blob.core.windows.net/report4/System.Threading.Tasks.Dataflow.diff.html) ( csv )
  • [ ] [System.Threading.Tasks.Parallel](http://tempcoverage.blob.core.windows.net/report4/System.Threading.Tasks.Parallel.diff.html) ( csv )
  • [ ] [System.Threading.Thread](http://tempcoverage.blob.core.windows.net/report4/System.Threading.Thread.diff.html) ( csv )
  • [ ] [System.Transactions.Local](http://tempcoverage.blob.core.windows.net/report4/System.Transactions.Local.diff.html) ( csv )
  • [ ] [System.Web.HttpUtility](http://tempcoverage.blob.core.windows.net/report4/System.Web.HttpUtility.diff.html) ( csv )
  • [ ] [System.Xml.XPath.XDocument](http://tempcoverage.blob.core.windows.net/report4/System.Xml.XPath.XDocument.diff.html) ( csv )

Спасибо Эрик!

Проверил следующее:

  • System.IO.Compression.Brotli
  • System.IO.Compression.ZipFile
  • System.IO.FileSystem.DriveInfo
  • System.IO.IsolatedStorage
  • System.IO.MemoryMappedFiles
  • Система.IO.Pipes
  • Система.Память

Очистка мертвого кода для:
System.Diagnostics.DiagnosticSource
System.Diagnostics.FileVersionInfo
Система.Диагностика.Процесс
System.Diagnostics.StackTrace
System.Diagnostics.TextWriterTraceListener
Система.Диагностика.Инструменты
System.Diagnostics.TraceSource
Система.Диагностика.Трассировка
Система.Рисование.Примитивы

дотнет/corefx#33095

Я хотел бы заняться очисткой System.IO.Compression в качестве своего первого вклада.

В стартовом посте System.Console помечен как выполненный, но в восстановленных данных не помечен. Я обнаружил, что для очистки требуется только несколько строк SR .
Итак, @ericsstj , это какая-то ошибка, или я могу взглянуть на другие библиотеки и исправить такие маленькие мертвые коды?

Резюме

Я создал небольшой инструмент, который удаляет некоторые бесполезные вещи из этих данных .


Удаляет:

  1. Все константы, отмеченные красным.

Это очень распространено. Все, что содержит «const», игнорируйте. Это все поля, встроенные компилятором, мы хотим сохранить их в исходниках. Обычно целые числа и строки.

  1. Все, что не помечено красным (этот код не умер).

Это остается:

  1. Любой класс или структура уровня вложенности, которые содержат мертвый код. Это помогает быстрее найти этот код.
  2. Все строки SR , которые можно удалить. Но имейте в виду, что методы SR тоже не удаляются.

Все, что является «статической строкой» в «классе SR», является особенным. Вместо редактирования файла C# вы должны найти соответствующую запись в файле .resx и удалить ее. Файл .resx для библиотеки находится в srcsrcResourcesstrings.resx. Сборка восстановит SR после того, как вы это сделаете. Игнорируйте все остальное в «классе SR» — есть несколько методов, которые могут оказаться мертвыми.

  1. Классы только с одним конструктором без параметров. Это помогает не делать с ними ничего.

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

Игнорируйте любые общедоступные конструкторы без параметров, если нет других конструкторов. Это не реально.


Также:

Вы можете найти очищенные файлы здесь . Упомяните меня после обновления данных, и я обновлю это.

@ericsstj Безопасно ли удалять internal enum ?

После использования этого инструмента я проверил все сборки. Некоторые из них не имеют мертвого кода.
Обновленный список выглядит примерно так, как показано ниже. Я меняю ссылки на htmlpreview для очищенных файлов из репозитория инструмента . Надеюсь, никто не будет против.

Итак, @ericsstj , это какая-то ошибка, или я могу взглянуть на другие библиотеки и исправить такие маленькие мертвые коды?

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

@ericsstj Безопасно ли удалять внутреннее перечисление?

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

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

  1. Добавьте инструмент сравнения в файл open. Я использую AsmDiff, который является внутренним. Мы могли бы открыть исходный код или создать что-то новое поверх существующих библиотек (SRM, CCI или Cecil).
  2. Разрешите проектам подписаться на эту проверку без мертвого кода и подавить то, что пропускает инструмент.
  3. Повторите 2, поместив эвристику в правила различия и/или фильтрации.
  4. Как только у нас будет достаточно функциональности в инструменте, включите его для всего репо, зафиксируйте базовые показатели, где мы разрешаем мертвый код, и никогда больше не придется возвращаться к этой проблеме 😄

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

@ericsstj технически возможно работать на corelib? Я заметил мёртвый метод в corelib, и наверняка есть ещё. Конечно, это потребует осторожности, учитывая все обратные вызовы от виртуальной машины.

@danmosemsft Он уже работает на System.Private.Corelib.dll как часть сборки coreclr. Какой мертвый метод, который вы заметили, не удаляется?

@ericsstj Думаю, мы можем закрыть это?

Я думаю, что это сделано на данный момент. Большое спасибо всем, кто внес свой вклад в улучшение нашей кодовой базы!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

matty-hall picture matty-hall  ·  3Комментарии

chunseoklee picture chunseoklee  ·  3Комментарии

noahfalk picture noahfalk  ·  3Комментарии

v0l picture v0l  ·  3Комментарии

jchannon picture jchannon  ·  3Комментарии