Runtime: Bereinigen Sie toten Code

Erstellt am 5. Apr. 2017  ·  152Kommentare  ·  Quelle: dotnet/runtime

Nach dem Aktivieren des Mono-Linkers für unsere .NETCoreApp-Binärdateien hat er eine Reihe von Stellen identifiziert, an denen wir toten Code haben.

Diese fallen in 3 Kategorien.

  1. Wirklich toter Code, der nirgendwo in der Assembly verwendet wird.

    • Dies kann gelöscht werden

  2. Quelldateien, die in einem Build der Assembly verwendet werden, aber nicht in allen. Gemeinsame Quelldateien, bei denen einige Projekte die Quelle verwenden, aber nicht alle.

    • Diese können besser berücksichtigt und aufgeteilt werden, um bei Bedarf eine minimale Quelle bereitzustellen. Oder sie können wirklich toten Code enthalten.

  3. Quelle nur zur Kompilierzeit. Interne Konstanten, die beim Aufrufen von IL als Literale dargestellt und nicht öffentlich verfügbar gemacht werden.

    • Diese müssen bleiben.

Unterschiede

  • [ ] [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 von @YoupHulsebos
  • [x] [System.Collections.Immutable](http://tempcoverage.blob.core.windows.net/report2/System.Collections.Immutable.diff.html) ( csv ) – Nichts zu entfernen von @YoupHulsebos in 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 ) – Nichts zu entfernen von @YoupHulsebos in 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 ) – Behoben in dotnet/corefx#19141 von @ 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 ) – Nichts zu entfernen, https://github.com/dotnet /corefx/issues/17905#issuecomment-294286344 von @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 ) – Behoben in dotnet/corefx#19143 von @ YoupHulsebos
  • [x] [System.Linq.Queryable](http://tempcoverage.blob.core.windows.net/report2/System.Linq.Queryable.diff.html) ( csv ) – Nichts zu entfernen – https://github .com/dotnet/corefx/issues/17905#issuecomment-294286344 von @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 ) – Behoben in dotnet/corefx#19532 von @ Ermiar
  • [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 ) – Behoben in dotnet/corefx #19148 von @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 ) – Behoben in dotnet/corefx #19144 von @yaelkeemink
  • [x] [System.Security.Principal](http://tempcoverage.blob.core.windows.net/report2/System.Security.Principal.diff.html) ( csv ) – Nichts zu entfernen
  • [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 ) – Nichts zu entfernen
  • [x] [System.Threading.Tasks.Parallel](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Tasks.Parallel.diff.html) ( csv ) – Nichts zu entfernen
  • [x] [System.Threading.Thread](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Thread.diff.html) ( csv ) – Nichts zu entfernen
  • [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 ) – Nichts zu entfernen
  • [x] [System.Xml.XPath.XDocument](http://tempcoverage.blob.core.windows.net/report2/System.Xml.XPath.XDocument.diff.html) ( csv ) – Nichts zu entfernen

Hintergrund

Die Berichte wurden durch Aktivieren von ILLink (Mono-Linker-Build vom Codegen-Team /cc @erozenfeld) und Differenzieren der Ausgabe generiert.

Die Unterschiede stammen aus einem Windows-Build und sind auf Assemblys beschränkt, die Teil von NETCore.App sind.

Wenn der Linker aktiviert ist, erstellt er einen „PreTrim“-Ordner im Objektordner einer Baugruppe, zum Beispiel <corefx>\bin\obj\AnyOS.AnyCPU.Debug\Microsoft.CSharp\netstandard\PreTrim\Microsoft.CSharp.dll .

Um eine zentrale Kopie der getrimmten Baugruppen zu ermöglichen, können Sie die Eigenschaft BinPlaceILLinkTrimAssembly=true festlegen. Dadurch werden alle vorgetrimmten und getrimmten Baugruppen in einen Ordner unter bin: <corefx>\bin\ILLinkTrimAssembly\netcoreapp-Windows_NT-Debug-x64 kopiert.

Um die in dieser Ausgabe verlinkten Berichte zu generieren, benötigen Sie eine Kopie des AsmDiff.exe-Tools. Dieses Tool ist noch nicht für Core verfügbar, siehe (https://github.com/dotnet/buildtools/issues/1420). Wenn Sie die Desktop-Version des Tools haben, können Sie die Berichterstellung aktivieren, indem Sie AsmDiffCmd=<pathToAsmDiff.exe> einstellen

Der Linker kann für jedes Projekt aktiviert werden (nicht nur für die in NETCore.App), indem er mit ILLinkTrimAssembly=true erstellt wird, nachdem https://github.com/dotnet/corefx/pull/17825 zusammengeführt wurde.

wie man eine Bibliothek anpackt

Wählen Sie eine Bibliothek aus und notieren Sie sich, dass Sie daran arbeiten werden.

Öffnen Sie den obigen HTML-Bericht für die Bibliothek. Suchen Sie nach roten Linien. Diese sind theoretisch tot. Suchen Sie nach dem Code im Ordner src dieses Repos und löschen Sie ihn. Fahren Sie mit dem Bericht für die Bibliothek fort und löschen Sie den gesamten toten Code so.

ABER es gibt einige Sonderfälle:

  1. Dies ist eine sehr häufige. Irgendwas mit „const“, bitte ignorieren. Dies sind alles Felder, die vom Compiler eingefügt werden, wir möchten sie in den Quellen behalten. Typischerweise Ints und Strings.
  2. Alles, was „statischer String“ in „Klasse SR“ ist, ist etwas Besonderes. Anstatt eine C#-Datei zu bearbeiten, müssen Sie den passenden Eintrag in der .resx-Datei finden und diesen entfernen. Die .resx-Datei für eine Bibliothek befindet sich in src\<library>\src\Resources\strings.resx . Der Build generiert SR neu, nachdem Sie dies getan haben. Ignorieren Sie alles andere in „Klasse SR“ – es gibt mehrere Methoden, die als tot angezeigt werden können.
  3. Ignorieren Sie alle privaten parameterlosen Konstruktoren. Wir haben diese im Code, um zu verhindern, dass die Klasse versehentlich instanziiert wird. Wir möchten sie im Code behalten.
  4. Ignorieren Sie alle öffentlichen parameterlosen Konstruktoren, wenn keine anderen Konstruktoren vorhanden sind. Diese sind nicht echt.
  5. Einige Codes befinden sich nicht im Ordner der Bibliothek, sondern in src\common. Dieser Code ist möglicherweise nicht wirklich tot, da er möglicherweise von einer anderen Bibliothek verwendet wird. Idealerweise gep, um zu sehen, ob jemand anderes im Baum es verwendet – wenn ja, kann es gelöscht werden. Oder ignorieren Sie es und wir können später einen weiteren Durchgang machen.
  6. Wenn der Code nur in Unix, UAP usw. verwendet wird, löschen Sie ihn nicht. Es ist wahrscheinlich nicht tot. Sie können erkennen, ob es sich um einen solchen Typ handelt, indem Sie zB von #if uap umgeben sind oder in der .csproj-Datei eine Bedingung wie zB '$(TargetGroup)' == 'uap'" haben

Nachdem Sie den toten Code aus einer Bibliothek entfernt haben, stellen Sie sicher, dass er erstellt wird (führen Sie „msbuild“ im Ordner „src“ für die Bibliothek aus). Wenn dies nicht der Fall ist, gehen Sie rückwärts. Wenn es erstellt wird, überprüfen Sie als Nächstes die Tests, die erstellt und bestanden werden (führen Sie „msbuild /t:buildandtest“ im Ordner „tests“ aus). Auch wenn dies nicht der Fall ist, gehen Sie Ihre Schritte zurück.

Wenn das alles gut aussieht, können Sie eine PR für die Bibliothek aufgeben. Wenn die PR reingeht, können wir sie hier abhaken.

area-Meta easy enhancement untriaged up-for-grabs

Alle 152 Kommentare

Hier ist eine Tabelle, die den Unterschied in Bytes in absteigender Reihenfolge auflistet. XML hat bereits ein Problem

| | | |
|------------------------------------------------------------- ------|--|----|
| Bibliothek | Bytes entfernt | % Rückgang |
| GESAMT | 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 % |

Dies ist ein kinderleichtes Problem für einen neuen Mitwirkenden. Öffnen Sie einfach eine der HTM-Dateien und löschen Sie die rot markierten Quellen.

Eine offensichtliche Sache, die auffällt, ist, dass die generierte SR -Klasse fast immer mehrere Member hat, die nicht verwendet werden, und dass sie in allen (oder zumindest den meisten) unserer Assemblys auftaucht. Das könnte uns einige einfache globale Verbesserungen bringen, wenn wir herausfinden, wie wir das beheben können.

Ich sehe auch, dass in einigen Fällen private const -Felder angezeigt werden. Sie werden von der Implementierung dieser Klasse verwendet, sind aber offensichtlich nicht sichtbar oder werden außerhalb verwendet. Es lohnt sich wahrscheinlich nicht, diese Probleme zu "reparieren".

Wenn die Klassenimplementierung, die die private const -Felder verwendet, über einen Einstiegspunkt erreichbar ist, der außerhalb der Assembly sichtbar ist, werden die Felder nicht entfernt.

Vermutlich würden wir falsch positive Ergebnisse sehen, wenn eine Bibliothek Interna hat, für die sie sichtbar sind (z. B. für Komponententests), oder?

Wenn Assembly über InternalsVisibleTo verfügt, werden alle Internals ebenfalls als Roots betrachtet.

OK. Ich denke, es gibt einige Fälle, in denen Tests Reflektion verwenden, um Interna zu erhalten. Aber diese werden schnell entdeckt, wenn wir Tests durchführen.

@mellinoe

Eine offensichtliche Sache, die auffällt, ist, dass die generierte SR-Klasse fast immer mehrere Mitglieder hat, die nicht verwendet werden, und dass sie in allen (oder zumindest den meisten) unserer Assemblys auftaucht. Das könnte uns einige einfache globale Verbesserungen bringen, wenn wir herausfinden, wie wir das beheben können.

Ich habe bereits im Februar einen Pass gemacht und Hunderte von toten Saiten gelöscht. Es werden nur noch wenige übrig bleiben. Ich denke, dies sind Fälle, in denen die Methode, die auf die Zeichenfolge verweist, selbst getrimmt ist. In diesem Fall muss das resx natürlich getrimmt werden.

@danmosemsft Ich beziehe mich auf diesen Mitgliederblock, der immer in der generierten Datei ausgegeben wird:

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);

Oft (zumindest nach meinem kurzen Überfliegen 😄 ) wird nur das erste verwendet und gelegentlich das zweite. In einigen von denen, auf die ich geklickt habe, war dies der größte Teil des Diffs.

OK. Ich denke, es gibt einige Fälle, in denen Tests Reflektion verwenden, um Interna zu erhalten. Aber diese werden schnell entdeckt, wenn wir Tests durchführen.

Die meisten davon habe ich bereits behandelt: https://github.com/dotnet/corefx/pull/17825/commits/2277db969616a5ad4fd9f4a8118a3b4030ff62d3

Wir sind bereits Inner- und Outerloop clean.

Der Bericht für Dataflow besagt, dass Typen im Namespace System.Threading.Tasks.Dataflow.Internal.Threading tot sind. Das stimmt nicht, sie sind in der Standardkonfiguration tot, aber es gibt andere Konfigurationen, die sie verwenden. Siehe https://github.com/dotnet/corefx/pull/17912 für meine vorgeschlagene Änderung.

Gibt es wahrscheinlich noch andere Arten dieser Art? Gibt es etwas, das man gegen sie tun sollte?

Dieser Bericht gilt nur für NETCoreApp unter Windows. Es ist möglich, dass sie noch von einer anderen Konfiguration verwendet werden und vom Build -allConfigurations abgefangen werden, wenn jemand versucht, sie vollständig zu entfernen. Für Fälle wie diesen könnten Sie die NETCoreApp-Konfiguration verbessern, indem Sie die Quelle if-def'ing/aufteilen, wie ich oben in Punkt 2 erwähnt habe. Das sieht so aus, wie Sie es in dotnet/corefx#17912 tun

Wenn Sie daran interessiert sind, den Diff für andere Konfigurationen zu identifizieren, in denen wir den Linker nicht ausführen, können Sie ihn mithilfe der Details aktivieren, die ich im Hintergrundabschnitt aufgeführt habe. Dies wird einfacher, sobald der PR zusammengeführt ist, sodass Sie vielleicht einfach warten möchten.

@erozenfeld Wir möchten keine Konstanten entfernen, nur weil sie vom Compiler eingebettet sind, da dies die Codeklarheit verliert. Aber einige der Konstanten sind wirklich tot, und die wollen wir wahrscheinlich entfernen.

Beispielsweise ist in http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.TypeConverter.diff.html das gesamte VSStandardCommands als tot markiert. Einige sind sichtbar (über public class StandardCommands ) und nur eingebettet. Aber einige sind wirklich tot, zB cmdidThisWindow

Es wäre schön zu sehen, welche in die letztere Kategorie fallen.

Richtig, wir können vom Compiler eingefügte Konstanten nicht aus der Quelle entfernen. ILLink arbeitet auf msil und kann eine wirklich tote Konstante nicht von einer Konstante unterscheiden, die tot wurde, da sie überall inliniert wurde.

Es kennzeichnet auch alle privaten Standardkonstruktoren als tot, die wir im Allgemeinen nicht entfernen möchten, da sie ethere sind, um eine versehentliche parameterlose Konstruktion zu verhindern. Ich nehme an, das ist aus dem gleichen Grund unvermeidlich. Soweit ich denken kann, haben sie nach der Kompilierzeit keinen Zweck mehr.

Kennzeichnung als „einfach“ gemäß obiger Diskussion. Ich beabsichtige, einige Erstautoren auf dieses Problem hinzuweisen.

Wenn jemand eine Datei auswählt, teilen Sie dies bitte zu diesem Thema mit, um Doppelarbeit zu vermeiden.

@danmosemsft möchten Sie hier auch Ihre Anleitungen hinzufügen, die Sie an die Anbieter gesendet haben? Vielleicht wäre es am besten, es zum Top-Post hinzuzufügen, mit allen Ausnahmen / Dingen, die zu vermeiden sind ...

@karel fertig

Ich habe mir mal die Diffs angeschaut. Es gibt viel zu viel Lärm in ihnen - es war schwer für mich, etwas Einfaches und Umsetzbares zu finden. Können wir das Rauschen aus den Diffs (Konstanten, private parameterlose Konstruktoren, ...) so filtern, dass es nur die einfach umsetzbaren Elemente enthält?

Sie können die CSVs öffnen und beliebige Filter anwenden.

Es wäre schön, mit der Master-CSV herumzuspielen, um zu sehen, welcher Code in /src/common tatsächlich tot ist.

@erozenfeld Mir fehlt hier vielleicht etwas. es heißt in http://tempcoverage.blob.core.windows.net/report2/System.Reflection.DispatchProxy.diff.html , dass EventAccessorInfo.InterfaceRaiseMethod tot ist, aber es ist im Konstruktor gesetzt, was es selbst nicht ist tot.
https://github.com/dotnet/corefx/blob/master/src/System.Reflection.DispatchProxy/src/System/Reflection/DispatchProxyGenerator.cs#L919

Entfernen zu gewinnen und einfach, ich glaube nicht, dass es fertig ist (fühlen Sie sich frei zu ändern, wenn Sie denken, dass ich falsch liege)

Ich sehe nicht, warum es nicht fertig ist, die Anweisungen sind ziemlich klar ... ich denke, es ist eine Art gute Einführung. Wie auch immer, die Händler werden damit anfangen. Ich habe schon einige gemacht und viele abgehakt, die schon sauber sind.

Etwas anderes wird fälschlicherweise als tot markiert: Zeichenfolgen, die zur Laufzeit über SR.GetResourceString ("...") geladen werden. Leider gibt es noch welche zB return SR.GetResourceString("PropertyCategory" + value, null);

Das muss beim Code-Review aufgefangen werden.

Beim Überfliegen des Threads sah es so aus, als gäbe es Bedenken hinsichtlich Rauschen in den Ergebnissen. Auch hier fühle ich mich nicht stark - fühlen Sie sich frei, es zurück zu drehen ;-)

Das ist gut :)

In System.Transactions.Local gibt es Code, auf den derzeit nicht zugegriffen wird, aber auf einen Teil davon wird schließlich zugegriffen, sobald wir die Arbeit zur Unterstützung verteilter Transaktionen erledigt haben. Ich bin zurückhaltend, diesen Code einfach zu entfernen.

Ich habe bereits einen Teil des toten Codes, der hier in Microsoft.CSharp identifiziert wurde, und einige mehr entfernt (die Analyse hat nicht erkannt, dass z. B. ExpressionBinder.BindPtrToArray gemäß dotnet/corefx#17948 tot ist), und der Rest befindet sich in meinem Sehenswürdigkeiten als Teil meiner laufenden Umgestaltung dieser Assembly.

@danmosemsft In Bezug auf EventAccessorInfo.InterfaceRaiseMethod: Es heißt, dass get_InterfaceRaiseMethod tot ist, und da es kein set_InterfaceRaiseMethod gibt, ist die Eigenschaft tot. Der Code im Konstruktor legt das vom Compiler generierte Unterstützungsfeld festk__BackingField und ILLink halten das Feld.

@jimcarley das macht Sinn, ich habe S.Transactions.Local oben als erledigt überprüft. Ich denke, wenn es Krimskrams gibt, die tatsächlich tot sind, möchten Sie sie vielleicht irgendwann entfernen.

@JonHanna Wenn Sie glauben, dass ILLink hätte erkennen können, dass der Code tot war, würde ich @erozenfeld Bescheid geben.

@danmosemsft Ich wäre sehr beeindruckt, wenn das möglich wäre. Ich meinte nur, dass die hier erwähnten Teile bereits eine Teilmenge der Entfernungen sind, die ich vornehmen möchte, sodass dieser Punkt in der Liste abgedeckt wird.

@danmosemsft @JonHanna ILLink versucht nicht, unerreichbaren Code innerhalb von Methoden zu finden. Wenn eine Methode erreichbar ist, wird davon ausgegangen, dass alle Anweisungen innerhalb der Methode erreichbar sind.

Zum Nutzen anderer: Ein anderer Fall ist offline aufgetaucht, bei dem ein int-Feld von einem als tot gekennzeichneten Konstruktor zugewiesen wurde. Dieses Feld wurde jedoch an anderer Stelle gelesen, und sobald dieser Konstruktor entfernt wurde, warnte der Compiler, dass das Feld niemals festgelegt wurde. Das Lesegerät hat den Standardwert gelesen. In einem solchen Fall muss das Feld explizit initialisiert werden, wenn der tote Setter entfernt wird.

@erozenfeld dieser Code scheint tot zu sein: https://github.com/dotnet/corefx/compare/master...danmosemsft :dead.xml?expand=1
wurde aber nicht als tot gekennzeichnet. Es steht in der AWL (fields in struct). vermeidet ILLink speziell das Entfernen von Feldern aus Strukturen, falls sie zB in Interop verwendet werden?

In diesem speziellen Fall werden die Felder im impliziten statischen Konstruktor initialisiert, sodass sie scheinbar in der IL verwendet werden. Um sie als toten Code zu erkennen, müsste ILLink:

  • Erkennen Sie, dass die Felder im statischen Konstruktor zugewiesen sind und der Wert nirgendwo anders verwendet wird
  • Die Belegung dieser Felder hat keine Seiteneffekte
  • Schreiben Sie den Methodentext des statischen Konstruktors neu, um die Zuweisung dieser Felder zu entfernen, aber lassen Sie alles andere intakt.

Ach – natürlich.

Ich habe diese bemerkt, als sie in https://github.com/dotnet/corefx/pull/18395/files waren als tot) und einige Dinge wie Initialisierungen, von denen nur ein Mensch sagen kann, dass sie keine Nebenwirkungen haben. Nichts, was ILLink hätte finden sollen.

@huanwu das SGEN-Tool hat 400 KB toten Code.
Ist es sinnvoll, dies alles zu entfernen, oder ist es noch in Arbeit, werden Sie diesen Code verwenden?

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

In System.Linq und System.Linq.Queryable ist der einzige gekennzeichnete Code entweder verwendete Konstanten oder Methoden in gemeinsamen Dateien, in denen andere Methoden derselben Klasse in diesem Projekt verwendet werden, sodass sie keine weitere Arbeit erfordern.

Ich habe gerade mit einem von mir geschriebenen Tool toten Code identifiziert – siehe https://github.com/dotnet/corefx/pull/18395. Ich verwende Ihren Code als Eingabedaten, um meinen Code zu validieren.

In der Vergangenheit habe ich Roslyn (18,5 kloc) massiv gelöscht, was gut darin war, Code zu identifizieren, der nicht tot sein sollte – siehe die Kommentare auf https://github.com/dotnet/roslyn/pull/17630. dh nur im Debugger verwendet, aufgrund einer Regression, unvollständige Implementierung von Tests, sollte bedingt kompiliert werden.

@JonHanna danke! Der oberste Beitrag wurde mit Ihren Informationen aktualisiert.

dotnet/corefx#18414 entfernte den größten Teil des relevanten toten Codes in S.Linq.Expressions. Abgesehen von Konstanten usw. gibt es noch einige, die relevant werden könnten, wenn derzeit nicht unterstützte Funktionen portiert werden (einschließlich einer mit einem Problem, das genau dies erfordert), daher wäre es wahrscheinlich am besten, jetzt nicht weiter zu machen.

Klingt gut, ist in der Liste abgehakt. Die meisten anderen müssen nur minimal aufgeräumt werden. SGEN ist die große Ausnahme ( @huanwu siehe Frage oben)

@zhenlan Frage oben zu Microsoft.XmlSerializer.Generator.dll - es hat 400 KB toten Code (!) ... ist dieser Code vorübergehend tot, oder sind Sie mit dieser Arbeit fertig und jemand kann ihn löschen? Ich kann höchstwahrscheinlich die Anbieter bitten, einen Großteil der Arbeit zu übernehmen. Lass es mich wissen.

@danmosemsft Dies ist kein toter Code. Der größte Teil des Codes wird mit System.Private.Xml geteilt. Wenn Sie die Projektdatei https://github.com/dotnet/corefx/blob/master/src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj überprüfen, finden Sie die meisten Codedateien unter $(SourceDir)SystemXmlSerialisierung

@huanwu , auch wenn wir den Code nicht aus dem Repo löschen können (weil er von anderen verwendet wird), wenn der Code nicht in dieser Assembly verwendet wird, würden wir ihn idealerweise nicht in die Assembly kompilieren.
ReflectionAwareCodeGen
XmlSerializationWriterCodeGen
XmlSerializationCodeGen
alle scheinen tote Klassen. Idealerweise könnten sie in ihre eigenen Codedateien verschoben werden, sodass sie nur dort kompiliert werden, wo sie benötigt werden.

ReflectionAwareCodeGen befindet sich tatsächlich innerhalb #if XMLSERIALIZERGENERATOR , also ist es möglicherweise völlig tot, wenn es in dieser Assembly tot ist.

Auch die große Mehrheit der Zeichenfolgen wird in dieser Binärdatei nicht verwendet.

Wenn dieser Code in dieser Assembly tot ist, würde das 400 KB sparen, also lohnt es sich, dies zu tun.

Hallo @danmosemsft , ich verstehe vielleicht nicht ganz, wie der tote Code bestimmt wird, aber etwas fühlt sich falsch an.

Zum Beispiel hat die Diff-Datei Microsoft.XmlSerializer.Generator ReflectionAwareCodeGen rot markiert, was ich aus Sicht der Tools als toten Code interpretiert habe. Allerdings wird es hier eindeutig in Microsoft.XmlSerializer.Generator verwendet. Können Sie bitte zur Klärung beitragen?

OK, ich sehe, dass das Tool tatsächlich die gesamte Kette von * CodeGen als toter Code markiert hat. Bitte ignorieren Sie meine vorherige Frage und lassen Sie mich erklären. Das Microsoft.XmlSerializer.Generator-Projekt hatte gerade seinen ersten Check-in. Einige Codes sind nur vorübergehend tot. Sie werden verwendet, wenn wir mehr Arbeit erledigt haben. Vielleicht können wir das Tool erneut ausführen, wenn wir uns der Fertigstellung des Codes nähern?

@zhenlan genau das habe ich vermutet. Code Complete war eigentlich letzte Woche :) Vielleicht ist das ein DCR. Gibt es noch viel zu tun?

@danmosemsft ja was du angenommen hast ist richtig :)

Microsoft.XmlSerializer.Generator (Sgen) ist ein CLI-Tool, das nicht als Teil von .NET Core ausgeliefert wird. Für den Teil des Codes, den Sgen mit S.Private.Xml teilt, gibt es meiner Meinung nach keine großen Lücken außer Fehlerbehebungen, und wir streben 5/10 für ZBB an. Für den Teil des Codes, der ausschließlich unter Sgen liegt, gibt es mehr Feature-Arbeit zu erledigen, aber wir sollten aufgrund unterschiedlicher Release-Vehikel mehr Spielraum haben. Hoffe das klärt auf.

@erozenfeld Ein Großteil des verbleibenden löschbaren Codes sind wahrscheinlich Teile gemeinsam genutzter Dateien, die niemand verwendet. Ohne jede manuelle Analyse oder das lästige Zusammenfügen der CSV ist es nicht möglich, diesen Code zu bereinigen. Gibt es eine einfache Möglichkeit, ILLink über den gesamten Satz von Assemblys auszuführen und Dateien zusammenzuführen, die in mehreren Assemblys verwendet werden, sodass wir einen dieser HTML-Berichte erhalten können, die zeigen, was im gemeinsamen Code tot ist?

Wir möchten auch die Testassemblys einbinden, da einige Tests im Produktcode kompiliert werden (z. B. PathInternal.cs). Auch die Unix, weil sie natürlich gemeinsamen Code verwenden.

@danmosemsft Mein Tool kann das. dh führen Sie es auf der gesamten Codebasis aus, löschen Sie automatisch Zeilen einschließlich falsch positiver Ergebnisse, erstellen und wiederherstellen Sie es wiederholt und testen Sie es. Pushe es schließlich auf mein Github-Konto und erstelle einen Pull-Request. Wahrscheinlich ziemlich viel Arbeit, also nicht versuchen, es sei denn, es wird verwendet. Siehe https://github.com/dotnet/corefx/pull/18395 für Ergebnisse zu einer Teilmenge

@danmosemsft

Gibt es eine einfache Möglichkeit, ILLink über den gesamten Satz von Assemblys auszuführen und Dateien zusammenzuführen, die in mehreren Assemblys verwendet werden, sodass wir einen dieser HTML-Berichte erhalten können, die zeigen, was im gemeinsamen Code tot ist?

Nein, dafür gibt es keinen einfachen Weg. ILLink arbeitet mit Assemblys, nicht mit Quelldateien, die zu ihrer Generierung verwendet werden.

@erozenfeld Ich glaube nicht, dass ich das gemeint habe. Ich erwarte nicht, dass ILLink über Quellen arbeitet. Aber im Moment können alle gemeinsam genutzten Quellen, die in Binär X als tot angezeigt werden, nicht einfach gelöscht werden, da sie von Binär Y oder Z verwendet werden können. Wenn fiktiv alle unsere Bibliotheken in eine große DLL wie ILMerge oder ähnliches gelaufen wären, Wenn die PDBs entsprechend repariert sind, können wir jeden allgemeinen Code löschen, der sich als tot herausgestellt hat. Meine Frage war, ob ILMerge die Baugruppen zu einer zusammenführen und dann die Abschlussanalyse über diese ausführen könnte.

@danmosemsft Nein, ILLink kann keine Assemblys wie ILMerge zu einer zusammenführen. Ich weiß nicht, wie ILMerge mit kollidierenden Namen in Assemblys umgeht. Wenn Sie die Klasse NC in Assembly A und die Klasse NC in Assembly B haben, müssen Sie beim Zusammenführen im Allgemeinen beide beibehalten (und eine oder beide umbenennen), es sei denn, Sie können beweisen, dass sie im Grunde identisch sind.

Erwischt. Nun, vielleicht wird sich in Zukunft ein Ansatz ergeben. Es ist keine große Sache.

Mir fällt auch ein, dass dies mit einer Verarbeitung der CSVs möglich wäre ...

Alle diese Daten sind jetzt wahrscheinlich veraltet. Wir sollten die Berichte wahrscheinlich erneut ausführen, wenn Sie mehr daran arbeiten möchten. Eine Anleitung dazu finden Sie oben im Hintergrundabschnitt.

In System.Collections.Immutable und System.Collections.NonGeneric ist der einzige gekennzeichnete Code entweder verwendete Konstanten oder Methoden in gemeinsamen Dateien, in denen andere Methoden derselben Klasse in diesem Projekt verwendet werden, sodass sie keine weitere Arbeit erfordern.

Danke @YoupHulsebos , oberster Beitrag aktualisiert.

In System.IO.FileSystem.Watcher und System.Security.Cryptography.Primitives ist der einzige gekennzeichnete Code entweder verwendete Konstanten oder Methoden in gemeinsamen Dateien, in denen andere Methoden derselben Klasse in diesem Projekt verwendet werden, sodass sie keine weitere Arbeit erfordern.

@yaelkeemink dank aktualisierter Kontrollkästchen.

Hallo,
Als erstmaliger Beitragender würde ich gerne die System.Net.Mail -Bibliothek angehen, wenn das in Ordnung ist!

Sicher Danke! Fortfahren. Wenn Sie auf irgendwelche Straßensperren stoßen, pingen Sie uns hier an, um neue Probleme zu melden (und markieren Sie mich für das Routing).

Ich habe einen Pull-Request für System.Net.Mail erstellt und die Vereinbarung unterschrieben.

Danke @Ermiar! Top-Ausgabe aktualisiert mit Link zur PR.

Neuling hier - ich nehme folgendes:

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

🗄

Großartig, willkommen an Bord @garfbradaz!
Lassen Sie es uns wissen, wenn Sie PR einreichen, wir werden den obersten Beitrag aktualisieren ( @ViktorHofer können Sie bitte heute helfen?)

Sicher.

@garfbradaz Bitte stellen Sie nach dem Entfernen von möglichem totem Code sicher, dass alle Tests in beiden Projekten für Desktop und Core ausgeführt werden.
Sie können dies tun, indem Sie zuerst Folgendes ausführen:
build.cmd und build.cmd -framework:netfx von corefx root und danach die einzelnen Testprojekte wie folgt ausführen:
msbuild /t:RebuildAndTest und msbuild /t:RebuildAndTest /p:TargetGroup=netfx .

Zögern Sie nicht, mich zu kontaktieren, wenn Sie Hilfe benötigen. Danke für Ihre Hilfe!

Danke @ViktorHofer / @karelz - langsam durchpflügen

Es ist ein Fehlalarm aufgetreten: dotnet/corefx#19826 ist mit Code implementiert, der durch Commit 81506698 zu diesem Problem entfernt wurde. Obwohl die Methode vorerst „tot“ ist, ist es wichtig, dabei zu sein, um DbProviderFactories von .NET vollständig zurückzubringen. Es wird also wiederbelebt, wenn die PR von dotnet/corefx#19826 zusammengeführt wird.

Als erster Beitragender möchte ich System.Linq.Expressions ausprobieren.

Großartig @mccbraxton! Wenn Sie Hilfe benötigen, pingen Sie mich an.

@mccbraxton Es scheint, dass System.Linq.Expressions bereits bereinigt wurde. Willst du noch ein Stück nehmen?

@ViktorHofer Du hast recht - muss falsch gelesen haben. Wie wäre es mit System.Security.Cryptography.Algorithms?

Sieht gut aus! Ich habe Sie in die Tabelle aufgenommen. Bitte stellen Sie sicher, dass Sie keinen Code löschen, der von einem Ziel verwendet wird. Danke für Ihre Hilfe!

dotnet/corefx#18162 kümmerte sich um das, was im Bericht für Microsoft.CSharp übrig blieb, das wirklich tot war.

Hallo neuer Beitrag hier, ich kann System.ComponentModel.* nehmen

Danke @norek , mach es.

Hallo unten Zusammenfassung von System.ComponentModel.

  • root - Nichts zu entfernen
  • .Anmerkungen - nichts zu entfernen
  • .EventBasedAsync – nichts zu entfernen
  • .Primitives - als tot markiert, ist es aber nicht
  • .TypeConverters - ive Code entfernen. Aber ich bin verwirrt mit dem Operator != - er ist als tot markiert, aber ich kenne nicht alle Ihre Codierungskonventionen - sollte auch gelöscht werden?

Ich habe die Liste überprüft und in System.Diagnostics toten Code gefunden - StackTraceSymbols ist als tot markiert, aber der Name dieser Klasse im Lösungs-Explorer ist StackTraceSymbols.CoreCLR.cs . Ich habe in geschlossenen Problemen gefunden: dotnet/corefx#19368
und es ist tot oder nicht?

@mikem8361 besitzen Sie SDStackTraceSymbols?

Ich besitze es und es ist kein toter Code. Reflektion wird von System.Private.CoreLib verwendet, um diese Assembly zu laden und auf diese Klasse zu verweisen.

Coreclr kann also Quell-/Zeilennummerninformationen auf Stack-Traces für nicht behandelte Ausnahmen drucken.

@mikem8361 Danke für die Informationen. Es sieht so aus, als wäre es durch illinktrim.xml geschützt:

<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>

@ericstj @erozenfeld können wir die CSV-Datei reparieren, die ILLink ausgibt, sodass Code nicht als tot angezeigt wird, wenn wir ihn gezwungen haben, den Code beizubehalten?

Die CSVs, die wir haben, sind nur das Diff nach dem Trimmen, also haben sie keine Sachen, die explizit verwurzelt sind. Die in dieser Ausgabe verlinkten Daten sind nicht live. Es ist von einem einmaligen Durchlauf, als ich das Problem öffnete. Ich vermute, wenn Sie sich die Live-Informationen ansehen, wird es nicht mehr als Diff angezeigt.

Hallo, ich schreibe zum ersten Mal. Ich möchte System.Net.Http und System.Net.HttpListener ausprobieren.

@soapdogg mach es..

@AlexGhiondea wie erwähnt

Hallo. Kann ich Microsoft.VisulaBasic nehmen?

@ satano sicher, mach weiter. Es sieht so aus, als müssten nur ein paar Bits entfernt werden (alle konstanten Felder und parameterlosen ctor müssen laut meiner obigen Beschreibung nicht bleiben). Vielleicht könntest du auch CSharp machen?

Es gibt auch einige Bibliotheken, die neu sind, seit die obige Analyse durchgeführt wurde ...

OK, ich werde CSharp und VisualBasic machen.

PR für Microsoft.VisualBasic ist fertig.

In Bezug auf Microsoft.CSharp - alles, was in der Diff-Datei rot ist, wurde bereits entfernt. Also einfach im Heft markieren.

Überlassen wir dieses Problem Anfängern, oder kann ich fortfahren?

@Satano kannst du bitte die Änderung finden, die das rote Diff entfernt hat?
Es ist in Ordnung, fortzufahren, wir speichern es nicht nur für Anfänger.

Ich weiß nicht, ob es alles war, aber hier wurde etwas entfernt: https://github.com/dotnet/corefx/commit/3eb339702e2fcdf924b50c2e32d7e9e02395e52f

@JonHanna hat es sogar hier gesagt https://github.com/dotnet/corefx/issues/17905#issuecomment -291924301

Ich werde von oben fortfahren. Als nächstes nehme ich System.IO.Compression , System.IO.FileSystem.AccessControl und System.IO.FileSystem .

@ satano mach es - du musst nicht um Erlaubnis fragen, wenn jemand anderes nachschaut, würde er hier posten.

Ein interessantes "Meta-Problem" für jemanden ist, ob es eine Möglichkeit gibt, dasselbe Linker-Tool zu verwenden, um gemeinsamen Code zu finden, den niemand verwendet. Wenn eine aus srccommon abgerufene Klasse nur teilweise von einer Bibliothek verwendet wird, wird sie in dieser Analyse als tot angezeigt, aber sie kann nicht entfernt werden, da sie möglicherweise von einer anderen Bibliothek abgerufen und verwendet wird. Was ich dachte, ist, wenn es eine Möglichkeit gibt, die Assemblys zusammenzuführen, dann führen Sie den Linker auf ihnen aus. @erozenfeld könnten wir den Linker zum Zusammenführen verwenden und dann toten Code im Ergebnis finden?

ILLink kann derzeit keine Assemblys zusammenführen. Wir erwägen, dies in Zukunft hinzuzufügen. Es gibt andere Tools, die das können: https://github.com/Microsoft/ILMerge und https://github.com/gluck/il-repack , obwohl ich nicht sicher bin, ob sie dieses Szenario so handhaben, wie wir es wollen. Sie erkennen vielleicht oder auch nicht, dass die Typen/Methoden/Felder mit widersprüchlichen Namen identische Entitäten darstellen.

Ich mache weiter mit System.Net.Http , System.Net.HttpListener und System.Net.NetworkInformation .

Ich werde ganze System.Net.* einzeln nehmen.

Fahren Sie mit dem Rest fort: System.Private.* , System.Runtime.* und System.Security.* .

@Karelz

… können Sie bitte die Änderung finden, die das rote Diff entfernt hat?

dotnet/corefx#18162

Nun ... Wahrscheinlich ist es an der Zeit, dieses Problem zu überprüfen und es vielleicht zu schließen?

Toter Code aus diesen Projekten wurde entfernt und zusammengeführt:

  • Microsoft.CSharp (bereits früher gemacht, wie im obigen Kommentar erwähnt)
  • Microsoft.VisualBasic
  • System.IO.Komprimierung
  • System.IO.Dateisystem
  • System.IO.FileSystem.AccessControl
  • System.Net.Http
  • System.Net.HttpListener
  • System.Net.NetworkInformation
  • System.Net.Primitives
  • System.Net.Requests
  • System.Net.Sicherheit
  • System.Net.Sockets
  • System.Net.WebClient
  • System.Net.WebSocket.Client
  • System.Private.DataContractSerialization
  • System.Private.Uri
  • System.Security.Cryptography.Cng
  • System.Security.Cryptography.Csp

Ich habe mir auch die restlichen Projekte angesehen und es gibt nichts zu tun:

  • System.Net.WebHeaderCollection
  • System.Net.WebSockets
  • System.Runtime
  • System.Runtime.Serialization.Primitives
  • System.Sicherheit.Zugriffssteuerung
  • System.Sicherheitsansprüche
  • System.Sicherheit.Kryptografie.Algorithmen
  • System.Sicherheit.Kryptografie.Verschlüsselung
  • System.Sicherheit.Kryptographie.OpenSsl

Das einzige verbleibende Projekt ist also Microsoft.XmlSerializer.Generator . Es hat den größten Teil des toten Codes, aber wie in einigen Kommentaren hier erwähnt, ist dort eine Arbeit im Gange - so wie ich es verstanden habe.

Ist dieses Problem abgeschlossen? Wenn nicht, könnte ich System.Console nehmen?

@ Iroca88 sicher. Beachten Sie, dass die oben verlinkten Dumps jetzt möglicherweise etwas veraltet sind.

Danke @danmosemsft , irgendwelche Vorschläge zum Erhalten neuer Dumps? Ansonsten beginne ich mit den oben bereitgestellten Dumps.

Übrigens: ist @lroca88 , ich habe den ersten Buchstaben (L) groß geschrieben, um diese Art von Verwirrung zu vermeiden :)

@Lroca88 der oberste Beitrag erklärt, wie man auf die getrimmten und vorgetrimmten Baugruppen zugreift. Um sie zu unterscheiden, haben wir ein Tool verwendet, das nicht öffentlich zu sein scheint. Sie könnten einen Decompiler wie Ilspy On verwenden und einen Textvergleich mit den Ergebnissen durchführen. Das würde wohl funktionieren.

Ich werde ein aktuelles Diff ausführen und es teilen. Bleiben Sie dran.

Hier ist das Neueste:

  • [ ] [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 )

Cool, ich hatte Probleme mit der alten Liste! 🔨

@Lroca88 Lesen Sie unbedingt die Hinweise in den oberen Posts, wie Sie diesen Pass ausführen, um etwas Verwirrung zu vermeiden.

Hoppla. Ich habe zwei neu verwaiste Bits in Microsoft.CSharp in dotnet/corefx#26491 übersehen. Das bekomme ich bald hin.

Aus der neuen Liste haben System.Runtime, System.Web.HttpUtility, System.Linq und System.Linq.Queryable nur Konstanten, die nicht wirklich tot sind, und etwas gemeinsam genutzten Code. System.Linq.Expressions enthält diese und einige Elemente, die in Debugansichten und Ressourcen verwendet werden, die mit bestimmten Compilerkonstanten verwendet werden, und sollten daher entfernt werden, damit diese fünf alle abgehakt werden können.

Ich habe die Bibliotheken, die von @JonHanna überprüft wurden, und die, die ich überprüft habe, in einer Liste zusammengeführt. Ich werde die Liste so lange aktualisieren, wie es meine Zeit zulässt. Wenn jemand dieser Liste Elemente hinzufügen möchte, können Sie mich gerne anpingen!

Bibliothek | Bewertet von | Status
-- | -- | --
Microsoft.CSharp (csv) | @JonHanna | dotnet/corefx#27104
Microsoft.VisualBasic (csv) | @Lroca88 | Nichts zu entfernen
Microsoft.Win32.Primitives (csv) | @Lroca88 | Nichts zu entfernen
Microsoft.Win32.Registry (csv) | @Lroca88 | Nichts zu entfernen
System.Collections.Concurrent (csv) | @Lroca88 | Nichts zu entfernen
System.Sammlungen (csv) | @Lroca88 | Nichts zu entfernen
System.Laufzeit (csv) | @JonHanna | Nichts zu entfernen
System.Web.HttpUtility (csv) | @JonHanna | Nichts zu entfernen
System.Linq (csv) | @JonHanna | Nichts zu entfernen
System.Linq.Abfragefähig (csv) | @JonHanna | Nichts zu entfernen

Danke @Lroca88 !

Es überrascht mich nicht, dass nicht mehr viel toter Code übrig ist. Wie oben erwähnt, kann dieser Prozess jedoch nicht feststellen, ob der Code in srccommon tot ist (da er möglicherweise in einer Assembly als tot angezeigt wird, in einer anderen jedoch nicht). Wenn Sie daran interessiert sind, einen Lösungsweg zu finden, werden Sie wahrscheinlich mehr toten Code finden. Beispielsweise ist es möglich, die Assemblys zu ILMergen und dann die Analyse des toten Codes darauf auszuführen. Oder es kann einfacher sein, die CSVs nachzubearbeiten, um gemeinsamen Code zu finden, der in allen tot ist. @ericstj hattest du ideen?

Ich freue mich, @danmosemsft helfen zu können,
Ich stimme Ihnen zu, was die Verbesserung dieses Prozesses anbelangt. Aus meinen Überprüfungen geht hervor, dass der am häufigsten gekennzeichnete Code nicht tot ist, entweder konstant ist oder häufig in einer anderen Assembly verwendet wird, wie Sie zuvor gesagt haben. Wenn man sich diese Fehlalarme ansieht, wird die Jagd meiner Meinung nach etwas langweilig.

Leider weiß ich nicht, wie ich die ILMerge- und die Dead-Code-Analyse durchführen oder die CSVs nachbearbeiten soll. Ich bin jedoch bereit zu lernen/zusammenzuarbeiten, wenn ihr etwas Zeit damit verbringen wollt, mir Nachhilfe zu geben :)

Wo sind wir damit? Wird das OP über abgeschlossene Klassen auf dem Laufenden gehalten oder sollten wir diesen Kommentar jetzt verlassen?

@MisinformedDNA – verwenden Sie bitte https://github.com/dotnet/corefx/issues/17905#issuecomment -365349091

Ich weiß nicht, wie ich die Analyse von ILMerge und totem Code durchführen oder die CSVs nachbearbeiten soll. Ich bin jedoch bereit zu lernen/zusammenzuarbeiten, wenn ihr etwas Zeit damit verbringen wollt, mir Nachhilfe zu geben :)

Ich weiß es auch nicht und müsste nachdenken/experimentieren. Im Moment bin ich voll damit beschäftigt, die Version 2.1 zu schließen, also muss dies ein bisschen warten 😺

Ich habe ein Skript geschrieben, um alle CSVs zu laden, und dann nur die umsetzbarsten herausgefiltert. Ich habe 3.942 Probleme/Möglichkeiten gefunden.

Ich beabsichtige nun, mir jedes der Probleme anzusehen und geeignete Maßnahmen zu ergreifen. Sie können meinen Fortschritt verfolgen und Feedback hinterlassen, wenn Sie möchten, unter https://github.com/MisinformedDNA/corefx/tree/clean-dead-code

Schön, ich freue mich darauf, diese @MisinformedDNA zu sehen.

Ich habe ein Problem mit der Analyse des toten Codes gefunden, das entweder auf ein Problem oder einen Mangel mit dem Tool hinweist.

Der Bericht besagt, dass Folgendes entfernt werden kann:

    Friend Enum vbErrors
        ObjNotSet = 91
        IllegalFor = 92
    End Enum

Aber diese Enums werden an anderer Stelle referenziert, also schauen wir uns einen möglichen Zweig an:

    ' 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

Die Logik hat mich an den Punkt gebracht, an dem die erste „Wenn“-Aussage niemals wahr ist. Aber diese "If"-Anweisung ist eine null -Prüfung, also müssten wir davon ausgehen, dass jemand null eingeben würde und dass es einen fehlenden Fall zum Bestimmen von totem Code gibt. Und wenn es ein Problem (oder mehr) mit der Bestimmung von totem Code gibt, dann ist eine oder mehrere der Enums möglicherweise doch kein toter Code.

tldr: Zusammenfassung

Frage 1: Warum ist VbMakeIllegalForException nicht zum Entfernen markiert, obwohl es unmöglich die zum Entfernen markierte Aufzählung aufrufen konnte.
Frage 2: Warum übergeben die Testfälle beim Bestimmen von totem Code keine Nullwerte für alle anwendbaren Parameter?

@ericstj

Die Enum-Werte wurden wahrscheinlich in msil eingefügt, sodass das Tool sie nicht sieht. Dasselbe gilt für Konstanten. In diesen Fällen sollte nichts für den Quellcode getan werden.

Ich bin gerade damit fertig, toten Code für System.Data.Common zu entfernen, wobei build.cmd src\System.Data.Common erfolgreich abgeschlossen wurde. Bisher hatte ich den Eindruck, dass ich nur in der Bibliothek arbeiten musste, in der ich mich befand, und wenn der Build und die Tests bestanden wurden, war ich startklar. Aber ich habe mich trotzdem für einen vollständigen Build entschieden, und ich bin froh, dass ich das gemacht habe, weil ich eine Menge Fehler bekommen habe.

Hier sind einige Beispielfehler:

SystemDataSqlClientSqlCommandBuilder.cs(277,17): Fehler CS0117: „ADP“ enthält keine Definition für „RemoveStringQuotes“ [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataProviderBaseDbConnectionPool.cs(984,33): Fehler CS0117: „ADP“ enthält keine Definition für „SetCurrentTransaction“ [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
D:ReposcorefxsrcCommonsrcSystemDataProviderBaseDbMetaDataFactory.cs(409,21): Fehler CS0117: „ADP“ enthält keine Definition für „IsEmptyArray“ [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataCommonDbConnectionStringCommon.cs(180,27): Fehler CS0117: „ADP“ enthält keine Definition für „InvalidConnectionOptionValue“ [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]

Die fehlenden Mitglieder wurden alle klar zum Löschen in System.Data.Common.diff.html angegeben, aber sie verursachen nicht nur Fehler in untergeordneten Klassen, sondern es gibt auch keine Diff-Dateien für diese untergeordneten Klassen oder die zugehörigen Assemblys wie System.Data.SqlClient .

Der erste oben gezeigte Fehler ist mit einer öffentlichen Methode verknüpft, SqlCommandBuilder.UnquoteIdentifier . Ich sehe also nicht, wie ADP.RemoveStringQuotes aus System.Data.Common entfernt werden kann, ohne dass es zu einer Änderung in anderen Klassen kommt.

Wie soll ich mit diesen umgehen? Irgendwelche Ideen, warum sie zum Entfernen markiert sind?

@anipik kannst du @misinformeddna hier helfen?

@MisinformedDNA Sie müssen immer das gesamte Repo erstellen und die Tests für alle Bibliotheken ausführen, da es möglich ist, dass eine Bibliothek direkt (A verwendet einen Typ von B) oder indirekt von einer anderen Bibliothek abhängig ist. (A verwendet einen Typ von B, der einen Typ von C verwendet)
Es gibt nichts in der Funktion ADP.removeStringQuotes , isemptyarray , setTransaction , das nur spezifisch für ApaterUtil oder System.Data.Common ist, also können wir es einfach nach sqlCommandBuilder.cs verschieben

Alle Methoden, die Sie oben erwähnt haben, sind internal static methods , die in der Assembly, in der sie definiert sind, nicht mehr verwendet werden.
Interne Member sind im Allgemeinen nicht dazu gedacht, außerhalb der Assembly verwendet zu werden, für die sie definiert sind. aber in manchen Fällen tun wir das, indem wir das Attribut „Internals Visible To“ verwenden.

@danmosemsft verschiebt diese internen Funktionen in die Baugruppen, wo sie optimal verwendet werden?

Hier ist der Fork, an dem ich arbeite: https://github.com/MisinformedDNA/corefx/tree/clean-dead-code

Wie bereits erwähnt, sagt die Analyse des toten Codes, dass ADP.RemoveStringQuotes für System.Data.Common entfernt werden könnte. Da jedoch ADP mit internal gekennzeichnet war, hat der Analysator möglicherweise angenommen, dass es nicht außerhalb der Assembly verwendet wurde. Ich bin mir nicht sicher, ob es nach dem Attribut InternalsVisibleTo sucht, aber es wäre egal, wenn es so wäre, weil es hier nicht verwendet wird. Stattdessen wird es über verknüpfte Dateien geteilt.

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

Ich nehme an, dass der Analysator die verschiedenen ADP -Klassen als getrennte und nicht als gemeinsam genutzte Typen betrachtet, da sie im Wesentlichen dupliziert werden. Während also das Entfernen RemoveStringQuotes für System.Data.Common richtig ist, ist es falsch, wenn man andere Projekte betrachtet, mit denen es verknüpft ist.

Wenn der Analysator nicht feststellen kann, dass alle diese Klassen aus derselben Datei stammen, werden wir ständig denken, dass wir in einigen dieser Dateien toten Code haben.

Wenn jemand keinen besseren Vorschlag hat, füge ich diese Methoden wieder dem Code hinzu.

@MisinformedDNA Ich habe offline mit @danmosemsft darüber gesprochen. Ein anderer möglicher Ansatz besteht darin, die ADP-Klasse partiell zu machen. Und dann können Sie diese Funktionen in diese Bibliotheken verschieben.

Ich habe meine erste PR eingereicht, aber 2 der Builds sind fehlgeschlagen. Beide Build-Fehler scheinen auf eine Zeitüberschreitung hinzuweisen. Welche Maßnahmen sollte ich ergreifen, um dies zu beheben?

Siehe https://github.com/dotnet/corefx/pull/28795

Ich werde mir die System.Private.Uri ansehen

Hier ist eine App(s) , die ich geschrieben habe, um alle Dateien herunterzuladen, sie zu kombinieren und dann alle herauszufiltern, die wahrscheinlich falsch positiv sind. Hoffentlich wird es für andere hilfreich sein.

@ericstj macht es Sinn, die Daten neu zu generieren, damit wir ein klareres Bild haben, wo wir damit stehen?

Gestartet auf den folgenden Namespaces:

  • System.Sammlungen.Spezialisiert

    • Nur 2 Eigenschaften von CompatibleComparer, aber Datei in src/common und weiter verbreitet.

  • System.Diagnostics.DiagnosticSource
  • System.Diagnostics.FileVersionInfo
  • System.Diagnose.Prozess
  • System.Diagnostics.StackTrace
  • System.Diagnostics.TextWriterTraceListener
  • System.Diagnose.Tools
  • System.Diagnostics.TraceSource
  • System.Diagnose.Ablaufverfolgung

Ich habe die Daten neu generiert. Hier ist es als neue Liste, ich wollte nicht überschreiben, was dort war, falls die Leute es für relevant halten.

  • [ ] [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 )

Danke Erich!

Habe folgendes überprüft:

  • System.IO.Compression.Brotli
  • System.IO.Compression.ZipFile
  • System.IO.FileSystem.DriveInfo
  • System.IO.IsolatedStorage
  • System.IO.MemoryMappedFiles
  • System.IO.Pipes
  • Systemspeicher

Bereinigung von totem Code für:
System.Diagnostics.DiagnosticSource
System.Diagnostics.FileVersionInfo
System.Diagnose.Prozess
System.Diagnostics.StackTrace
System.Diagnostics.TextWriterTraceListener
System.Diagnose.Tools
System.Diagnostics.TraceSource
System.Diagnose.Ablaufverfolgung
System.Zeichnung.Primitive

dotnet/corefx#33095

Als ersten Beitrag möchte ich die Reinigung von System.IO.Compression übernehmen.

Im Startbeitrag System.Console als fertig markiert, aber in neu generierten Daten nicht markiert. Ich habe festgestellt, dass nur einige Zeichenketten SR gelöscht werden müssen.
Also, @ericstj , ist es eine Art Fehler oder kann ich einen Blick auf andere Bibliotheken werfen und so kleine tote Codes reparieren?

Zusammenfassung

Ich habe ein kleines Tool erstellt, das einige nutzlose Dinge aus diesen Daten entfernt.


Es entfernt:

  1. Alle const die rot markiert sind.

Dies ist eine sehr häufige. Irgendwas mit „const“, bitte ignorieren. Dies sind alles Felder, die vom Compiler eingefügt werden, wir möchten sie in den Quellen behalten. Typischerweise Ints und Strings.

  1. Alle Sachen, die nicht rot markiert sind (dieser Code ist nicht tot).

Bleibt:

  1. Jede Klasse oder Struktur auf Verschachtelungsebene, die toten Code enthält. Es hilft, diesen Code schneller zu finden.
  2. Alle Zeichenfolgen SR , die entfernt werden können. Aber die Methoden SR werden nicht ebenfalls entfernt, seien Sie sich dessen bewusst.

Alles, was „statischer String“ in „Klasse SR“ ist, ist etwas Besonderes. Anstatt eine C#-Datei zu bearbeiten, müssen Sie den passenden Eintrag in der .resx-Datei finden und diesen entfernen. Die .resx-Datei für eine Bibliothek befindet sich in srcsrcResourcesstrings.resx. Der Build generiert SR neu, nachdem Sie dies getan haben. Ignorieren Sie alles andere in „Klasse SR“ – es gibt mehrere Methoden, die als tot angezeigt werden können.

  1. Klassen mit nur einem parameterlosen Konstruktor. Es hilft, nichts mit ihnen zu tun.

Ignorieren Sie alle privaten parameterlosen Konstruktoren. Wir haben diese im Code, um zu verhindern, dass die Klasse versehentlich instanziiert wird. Wir möchten sie im Code behalten.

Ignorieren Sie alle öffentlichen parameterlosen Konstruktoren, wenn keine anderen Konstruktoren vorhanden sind. Diese sind nicht echt.


Ebenfalls:

Gelöschte Dateien finden Sie hier . Erwähnen Sie mich nach dem Aktualisieren von Daten und ich werde das aktualisieren.

@ericstj ist es sicher, internal enum zu entfernen?

Nachdem ich dieses Tool verwendet habe, habe ich alle Baugruppen überprüft. Einige von ihnen haben keinen toten Code.
Die aktualisierte Liste sieht in etwa so aus wie unten. Ich ändere Links zu htmlpreview für gelöschte Dateien aus dem Repository des Tools . Hoffe, es stört niemanden.

Also, @ericstj , ist es eine Art Fehler oder kann ich einen Blick auf andere Bibliotheken werfen und so kleine tote Codes reparieren?

Beim Regenerieren der Diffs habe ich mit allem wieder gelöscht angefangen. Der Mechanismus zum Durchführen der Dead-Code-Diffs ist zu manuell. Es verwendet ein internes Tool für die Assembly-Diffs.

@ericstj ist es sicher, die interne Aufzählung zu entfernen?

Es hängt davon ab, was mit dieser internen Aufzählung gemacht wird. Enums werden in der Binärdatei oft als tot angezeigt, da der Compiler ihre Quellreferenz in Integer-Literale umwandelt. Sie werden wahrscheinlich feststellen, dass die Quelle es möglicherweise noch benötigt.

Nur ein paar Gedanken dazu, wie wir das Scrubbing von totem Code zu einer besseren Erfahrung machen können, die sich in Zukunft stabiler bewegt.

  1. Fügen Sie dem Open ein Differenzierungstool hinzu. Ich habe AsmDiff verwendet, das intern ist. Wir könnten das Open Source machen oder etwas Neues zusätzlich zu den bestehenden Bibliotheken (SRM, CCI oder Cecil) erstellen.
  2. Ermöglichen Sie Projekten, sich für diese No-Dead-Code-Validierung anzumelden, und unterdrücken Sie Dinge, die die Tools übersehen.
  3. Iterieren Sie auf 2, indem Sie Heuristiken in verschiedene und/oder Filterregeln einfügen.
  4. Sobald wir genügend Funktionalität in den Tools haben, aktivieren Sie sie für das gesamte Repo, schreiben Sie Baselines fest, wo wir toten Code zulassen, und müssen Sie nie wieder auf dieses Problem zurückkommen 😄

Heute ist der Mechanismus, den wir für das Tree-Shaking von totem Code verwenden, der Linker , der mit den Binärdateien arbeitet. Um das also wieder der Quelle zuzuordnen, unterscheiden wir seine Ausgabe mit der Eingabe und geben die IDs aus. Eine andere Sache, die ich in der Vergangenheit mit den Linker-Leuten besprochen habe, ist, mehr Protokollierung auszugeben, die direkter auf Dinge zurückgeführt werden könnte, die unseren Entwicklern wichtig sind. Es arbeitet auch mit PDBs, sodass es technisch gesehen über den gesamten Quellcode und die Zeileninformationen verfügt.

@ericstj ist es technisch möglich, auf Corelib zu laufen? Ich habe eine tote Methode in Corelib bemerkt, und zweifellos gibt es noch mehr. Angesichts all der Rückrufe von der VM wäre sicherlich Vorsicht geboten

@danmosemsft Es läuft bereits auf System.Private.Corelib.dll als Teil des Coreclr-Builds. Was ist die tote Methode, die Sie bemerkt haben und die nicht entfernt wird?

@ericstj Ich denke, wir können das schließen?

Ich denke, das ist jetzt erledigt. Vielen Dank an alle, die dazu beigetragen haben, unsere Codebasis zu verbessern!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen