Runtime: Nettoyer le code mort

Créé le 5 avr. 2017  ·  152Commentaires  ·  Source: dotnet/runtime

Après avoir activé l'éditeur de liens mono pour nos binaires .NETCoreApp, il a identifié un certain nombre d'endroits où nous avons du code mort.

Ceux-ci se répartissent en 3 catégories.

  1. Code vraiment mort qui n'est utilisé nulle part dans l'assembly.

    • Cela peut être supprimé

  2. Les fichiers source qui sont utilisés dans une version de l'assembly, mais pas tous. Fichiers source communs où certains projets utilisent la source, mais pas tous.

    • Ceux-ci peuvent être mieux factorisés, divisés pour fournir une source minimale en cas de besoin. Ou, ils peuvent contenir du code vraiment mort.

  3. Source de temps de compilation uniquement. Constantes internes représentées sous forme de littéraux lors de l'appel d'IL et non exposées publiquement.

    • Ceux-ci doivent rester.

différences

  • [ ] [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 par @YoupHulsebos
  • [x] [System.Collections.Immutable](http://tempcoverage.blob.core.windows.net/report2/System.Collections.Immutable.diff.html) ( csv ) - Rien à supprimer par @YoupHulsebos en 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 ) - Rien à supprimer par @YoupHulsebos en 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 ) - Corrigé dans dotnet/corefx#19141 par @ 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 ) - Rien à supprimer, https://github.com/dotnet /corefx/issues/17905#issuecomment-294286344 par @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 ) - Corrigé dans dotnet/corefx#19143 par @ YoupHulsebos
  • [x] [System.Linq.Queryable](http://tempcoverage.blob.core.windows.net/report2/System.Linq.Queryable.diff.html) ( csv ) - Rien à supprimer - https://github .com/dotnet/corefx/issues/17905#issuecomment-294286344 par @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 ) - Corrigé dans dotnet/corefx#19532 par @ 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 ) - Correction dans dotnet/corefx #19148 par @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 ) - Correction dans dotnet/corefx #19144 par @yaelkeemink
  • [x] [System.Security.Principal](http://tempcoverage.blob.core.windows.net/report2/System.Security.Principal.diff.html) ( csv ) - Rien à supprimer
  • [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 ) - Rien à supprimer
  • [x] [System.Threading.Tasks.Parallel](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Tasks.Parallel.diff.html) ( csv ) - Rien à supprimer
  • [x] [System.Threading.Thread](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Thread.diff.html) ( csv ) - Rien à supprimer
  • [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 ) - Rien à supprimer
  • [x] [System.Xml.XPath.XDocument](http://tempcoverage.blob.core.windows.net/report2/System.Xml.XPath.XDocument.diff.html) ( csv ) - Rien à supprimer

Contexte

Les rapports ont été générés en activant ILLink (mono linker build from codegen team /cc @erozenfeld) et en différant la sortie.

Les différences proviennent d'une version Windows et sont limitées aux seuls assemblys qui font partie de NETCore.App.

Lorsque l'éditeur de liens est activé, il produit un dossier "PreTrim" dans le dossier d'objets d'un assemblage, par exemple <corefx>\bin\obj\AnyOS.AnyCPU.Debug\Microsoft.CSharp\netstandard\PreTrim\Microsoft.CSharp.dll .

Pour activer une copie centrale des assemblages ajustés, vous pouvez définir la propriété BinPlaceILLinkTrimAssembly=true , Cela copiera tous les assemblages pré-ajustés et ajustés dans un dossier sous bin: <corefx>\bin\ILLinkTrimAssembly\netcoreapp-Windows_NT-Debug-x64 .

Pour générer les rapports liés dans ce numéro, vous devez disposer d'une copie de l'outil AsmDiff.exe. Cet outil n'est pas encore disponible pour le noyau, voir (https://github.com/dotnet/buildtools/issues/1420). Si vous disposez de la version de bureau de l'outil, vous pouvez activer les rapports en définissant AsmDiffCmd=<pathToAsmDiff.exe>

L'éditeur de liens peut être activé pour n'importe quel projet (pas seulement ceux de NETCore.App) en construisant avec ILLinkTrimAssembly=true après la fusion de https://github.com/dotnet/corefx/pull/17825.

comment aborder une bibliothèque

Choisissez une bibliothèque et notez que vous allez travailler dessus.

Ouvrez le rapport html ci-dessus pour la bibliothèque. Recherchez les lignes en rouge. Ceux-ci sont théoriquement morts. Recherchez le code dans le dossier src de ce référentiel et supprimez-le. Continuez à travers le rapport pour la bibliothèque et supprimez tout le code mort comme ça.

MAIS il y a des cas particuliers :

  1. C'est très courant. Tout ce qui contient "const", veuillez l'ignorer. Ce sont tous des champs intégrés par le compilateur, nous voulons les conserver dans les sources. Généralement des entiers et des chaînes.
  2. Tout ce qui est "chaîne statique" dans "classe SR" est spécial. Au lieu de modifier un fichier C #, vous devez rechercher l'entrée correspondante dans le fichier .resx et la supprimer. Le fichier .resx d'une bibliothèque se trouve dans src\<library>\src\Resources\strings.resx . La construction régénérera SR après cela. Ignorez tout le reste dans "classe SR" - il existe plusieurs méthodes qui peuvent apparaître comme mortes.
  3. Ignorez tous les constructeurs privés sans paramètre. Nous les avons dans le code pour éviter d'instancier accidentellement la classe, nous voulons les conserver dans le code.
  4. Ignorez tous les constructeurs publics sans paramètre s'il n'y a pas d'autres constructeurs. Ce ne sont pas réels.
  5. Certains codes ne seront pas dans le dossier de la bibliothèque, ils seront dans src\common. Ce code n'est peut-être pas mort car une autre bibliothèque peut l'utiliser. Idéalement, grep pour voir si quelqu'un d'autre dans l'arborescence l'utilise - si c'est le cas, il peut être supprimé. Ou ignorez-le et nous pourrons faire une autre passe plus tard.
  6. Si le code n'est utilisé que sous Unix, UAP, etc., ne le supprimez pas. Il n'est probablement pas mort. Vous pouvez dire s'il est de ce type en étant entouré par exemple #if uap ou en ayant une condition dans le fichier .csproj comme par exemple '$(TargetGroup)' == 'uap'"

Après avoir supprimé le code mort d'une bibliothèque, assurez-vous qu'il se construit (exécutez "msbuild" dans le dossier "src" de la bibliothèque). Si ce n'est pas le cas, revenez en arrière. Si c'est le cas, vérifiez ensuite la construction et la réussite des tests (exécutez "msbuild /t:buildandtest" dans le dossier "tests"). Encore une fois, s'ils ne le font pas, revenez sur vos pas.

Si tout semble bon, vous pouvez mettre en place un PR pour la bibliothèque. Lorsque le PR entre, nous pouvons le cocher ici.

area-Meta easy enhancement untriaged up-for-grabs

Tous les 152 commentaires

Voici un tableau répertoriant les différences en octets, par ordre décroissant. XML a déjà un problème

| | | |
|--------------------------------------------------------------- ------|---------------|------------|
| Bibliothèque | Octets supprimés | % de diminution |
| TOTALE | 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 % |

C'est un problème facile à saisir pour un nouveau contributeur. Ouvrez simplement l'un des fichiers htm et supprimez les sources marquées en rouge.

Une chose évidente qui saute aux yeux est que la classe SR générée a presque toujours plusieurs membres qui ne sont pas utilisés, et elle apparaît dans tous (ou du moins la plupart) de nos assemblys. Cela pourrait nous donner des améliorations globales faciles si nous trouvions comment résoudre ce problème.

Je vois aussi que les champs private const apparaissent dans certains cas. Ils sont utilisés par l'implémentation de cette classe, mais ne sont évidemment pas visibles ou utilisés à l'extérieur. Cela ne vaut probablement pas la peine d'essayer de "résoudre" ces problèmes.

Si l'implémentation de classe qui utilise les champs private const est accessible via un point d'entrée visible à l'extérieur de l'assembly, les champs ne sont pas supprimés.

Vraisemblablement, si une bibliothèque a des composants internes visibles (par exemple pour les tests unitaires), nous verrions des faux positifs, n'est-ce pas ?

Si l'assembly a InternalsVisibleTo, alors tous les éléments internes sont également considérés comme des racines.

D'ACCORD. Je pense qu'il y a quelques cas où les tests utilisent la réflexion pour obtenir des éléments internes. Mais ceux-ci seront rapidement découverts lorsque nous effectuerons des tests.

@mellinoe

Une chose évidente qui saute aux yeux est que la classe SR générée a presque toujours plusieurs membres qui ne sont pas utilisés, et elle apparaît dans tous (ou du moins la plupart) de nos assemblages. Cela pourrait nous donner des améliorations globales faciles si nous trouvions comment résoudre ce problème.

J'ai déjà fait une passe en février en supprimant des centaines de chaînes mortes. Il en restera très peu. Je pense que ce sont des cas où la méthode qui fait référence à la chaîne est elle-même coupée. Dans ce cas, bien sûr, le resx doit être coupé.

@danmosemsft Je fais référence à ce bloc de membres qui est toujours émis dans le fichier généré :

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

Souvent (du moins d'après mon bref survol 😄 ), seul le premier est utilisé, et occasionnellement le second. Dans certains de ceux sur lesquels j'ai cliqué, c'était le plus gros morceau du diff.

D'ACCORD. Je pense qu'il y a quelques cas où les tests utilisent la réflexion pour obtenir des éléments internes. Mais ceux-ci seront rapidement découverts lorsque nous effectuerons des tests.

J'ai déjà couvert la plupart d'entre eux : https://github.com/dotnet/corefx/pull/17825/commits/2277db969616a5ad4fd9f4a8118a3b4030ff62d3

Nous sommes déjà propres sur les boucles intérieure et extérieure.

Le rapport pour Dataflow indique que les types dans l'espace de noms System.Threading.Tasks.Dataflow.Internal.Threading sont morts. Ce n'est pas vrai, ils sont morts dans la configuration par défaut, mais il existe d'autres configurations qui les utilisent. Voir https://github.com/dotnet/corefx/pull/17912 pour mon changement proposé.

Est-il probable qu'il existe d'autres types comme celui-là? Y a-t-il quelque chose à faire à leur sujet?

Ce rapport concerne uniquement NETCoreApp sous Windows. Il est possible qu'une autre configuration les utilise encore et que cela soit intercepté par la construction -allConfigurations si quelqu'un essayait de les supprimer complètement. Pour des cas comme celui-ci, vous pouvez améliorer la configuration de NETCoreApp en if-def'ing/divisant la source comme je l'ai mentionné au point 2 ci-dessus. Cela ressemble à ce que vous faites dans dotnet/corefx#17912

Si vous souhaitez identifier le diff pour d'autres configurations où nous n'exécutons pas l'éditeur de liens, vous pouvez l'activer en utilisant les détails que j'ai énumérés dans la section d'arrière-plan. Ce sera plus facile une fois le PR fusionné, vous voudrez peut-être simplement attendre.

@erozenfeld Nous ne voudrons pas supprimer de constantes simplement parce qu'elles sont intégrées par le compilateur, car cela perd la clarté du code. Mais certaines const sont vraiment mortes, et celles que nous voulons probablement supprimer.

Par exemple, dans http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.TypeConverter.diff.html , l'ensemble de VSStandardCommands est marqué mort. Certains sont visibles (via public class StandardCommands ), et juste en ligne. Mais certains sont vraiment morts, par exemple cmdidThisWindow

Ce serait bien de pouvoir voir lesquels appartiennent à cette dernière catégorie.

C'est vrai, nous ne pouvons pas supprimer les constantes en ligne par le compilateur de la source. ILLink fonctionne sur msil et ne peut pas distinguer une constante vraiment morte d'une constante qui est devenue morte car elle a été insérée partout.

Il signale également comme morts tous les constructeurs privés par défaut, que nous ne voulons généralement pas supprimer car ils sont éthérés pour éviter toute construction accidentelle sans paramètre. Je suppose que c'est inévitable, pour la même raison. Pour autant que je sache, ils n'ont aucun but après la compilation.

Marquer comme "facile" selon la discussion ci-dessus. J'ai l'intention de signaler quelques nouveaux contributeurs à ce problème.

Si quelqu'un choisit un fichier, merci de le dire sur cette question, afin d'éviter la duplication du travail.

@danmosemsft voulez-vous également ajouter ici le guide que vous avez envoyé aux fournisseurs ? Peut-être que l'ajouter au top-post serait préférable, avec toutes les exceptions / choses à éviter ...

@karelz fait

J'ai jeté un coup d'œil rapide aux diffs. Il y a beaucoup trop de bruit en eux - il était difficile pour moi de trouver quelque chose de facile et d'action. Pouvons-nous filtrer le bruit des diffs (consts, constructeurs privés sans paramètre, ...) afin qu'il n'ait que les éléments faciles à actionner ?

Vous pouvez ouvrir les fichiers CSV et appliquer le filtre de votre choix.

Ce serait bien de jouer avec le CSV maître pour voir quel code dans /src/common est réellement mort.

@erozenfeld Il me manque peut-être quelque chose ici. il est dit dans http://tempcoverage.blob.core.windows.net/report2/System.Reflection.DispatchProxy.diff.html que EventAccessorInfo.InterfaceRaiseMethod est mort, mais il est défini dans le constructeur, qui n'est pas lui-même morte.
https://github.com/dotnet/corefx/blob/master/src/System.Reflection.DispatchProxy/src/System/Reflection/DispatchProxyGenerator.cs#L919

supprimer up-for-grabs et facile, je ne pense pas que ce soit prêt (n'hésitez pas à changer si vous pensez que je me trompe)

Je ne vois pas en quoi ce n'est pas prêt, les instructions sont assez claires... je pense que c'est une bonne introduction en quelque sorte. Quoi qu'il en soit, les vendeurs vont commencer. J'en ai déjà fait quelques-uns et j'en ai coché beaucoup qui sont déjà propres.

Quelque chose d'autre qu'il marque incorrectement comme mort : les chaînes qui sont chargées au moment de l'exécution via SR.GetResourceString("..."). Malheureusement, il y en a encore, par exemple return SR.GetResourceString("PropertyCategory" + value, null);

Cela doit être pris lors de la révision du code.

En parcourant le fil, il semblait qu'il y avait un problème de bruit dans les résultats. Encore une fois, je ne me sens pas fortement - n'hésitez pas à le retourner ;-)

C'est bon :)

Dans System.Transactions.Local, il y a du code qui n'est actuellement pas accessible, mais une partie de celui-ci sera éventuellement accessible une fois que nous aurons effectué le travail de prise en charge des transactions distribuées. Je suis réticent à supprimer simplement ce code.

J'ai déjà supprimé une partie du code mort identifié ici dans Microsoft.CSharp et d'autres (l'analyse n'a pas repéré que, par exemple, ExpressionBinder.BindPtrToArray est mort selon dotnet/corefx#17948) et le reste est dans mon vues dans le cadre de ma refactorisation en cours de cet assemblage.

@danmosemsft Concernant EventAccessorInfo.InterfaceRaiseMethod : cela signifie que get_InterfaceRaiseMethod est mort et qu'il n'y a pas de set_InterfaceRaiseMethod, la propriété est morte. Le code dans le constructeur définit le champ de sauvegarde généré par le compilateurk__BackingField et ILLink conserve le champ.

@jimcarley cela a du sens, j'ai vérifié S.Transactions.Local ci-dessus comme fait. Je suppose que s'il y a des bric et de broc qui sont réellement morts, vous voudrez peut-être les supprimer à un moment donné.

@JonHanna si vous pensez qu'ILLink aurait dû être capable de repérer que le code était mort, je le ferais savoir à @erozenfeld .

@danmosemsft Je serais extrêmement impressionné si cela pouvait, je voulais juste dire que les éléments mentionnés ici sont déjà un sous-ensemble de suppressions que j'ai l'intention de faire, donc cet élément de la liste va être couvert.

@danmosemsft @JonHanna ILLink n'essaie pas de trouver du code inaccessible dans les méthodes. Si une méthode est accessible, elle suppose que toutes les instructions il de la méthode sont accessibles.

Pour le bénéfice des autres : un autre cas est survenu hors ligne, où un champ int était affecté par un constructeur signalé comme mort. Cependant, ce champ était lu ailleurs, et une fois ce constructeur supprimé, le compilateur a averti que le champ n'était jamais défini. Le lecteur lisait la valeur par défaut. Dans un tel cas, le champ doit être explicitement initialisé lors de la suppression du setter mort.

@erozenfeld ce code semble mort : https://github.com/dotnet/corefx/compare/master...danmosemsft :dead.xml?expand=1
mais n'a pas été signalé comme mort. C'est dans l'IL (champs dans struct). ILLink évite-t-il spécifiquement de supprimer les champs des structures au cas où, par exemple, ils seraient utilisés dans l'interopérabilité ?

Dans ce cas particulier, les champs sont initialisés dans le constructeur statique implicite de sorte qu'ils semblent être utilisés dans l'IL. Pour les détecter en tant que code mort, ILLink devrait :

  • Détecter que les champs sont affectés dans le constructeur statique et que la valeur n'est utilisée nulle part ailleurs
  • L'affectation de ces champs n'a pas d'effets secondaires
  • Réécrivez le corps de la méthode du constructeur statique pour supprimer l'affectation de ces champs, mais gardez tout le reste intact.

Ah - bien sûr.

Je les ai remarqués tels qu'ils étaient dans https://github.com/dotnet/corefx/pull/18395/files .. d'autres trouvailles y sont diverses constantes qui sont mortes (ce que bien sûr ILLink ne peut pas dire car il montre toutes les constantes comme mort) et certaines choses comme les initialisations que seul un humain pourrait dire n'ont aucun effet secondaire. Rien de ce qu'ILLink aurait dû trouver.

@huanwu l'outil SGEN a 400 Ko de code mort.
Est-ce que tout cela est raisonnable à supprimer ou est-ce un travail en cours, vous allez utiliser ce code ?

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

Dans System.Linq et System.Linq.Queryable, le seul code signalé est soit des constantes, soit des méthodes utilisées dans des fichiers communs où d'autres méthodes de la même classe sont utilisées dans ce projet, elles ne nécessitent donc aucun travail supplémentaire.

Je viens d'identifier du code mort à l'aide d'un outil que j'ai écrit - voir https://github.com/dotnet/corefx/pull/18395. J'utilise votre code comme données d'entrée pour valider mon code.

Dans le passé, j'ai effectué une suppression massive sur Roslyn (18,5 kloc) qui a été efficace pour identifier le code qui ne devrait pas être mort - voir les commentaires sur https://github.com/dotnet/roslyn/pull/17630. c'est-à-dire uniquement utilisé dans le débogueur, en raison d'une régression, d'une implémentation incomplète des tests, doit être compilé conditionnellement.

@JonHanna merci ! Top post mis à jour avec vos informations.

dotnet/corefx#18414 a supprimé la plupart du code mort pertinent dans S.Linq.Expressions. Mis à part les constantes, etc., il y en a encore qui pourraient devenir pertinentes si des fonctionnalités actuellement non prises en charge sont portées (y compris une avec un problème qui ne demande que cela), il serait donc probablement préférable de ne pas aller plus loin maintenant.

Sonne bien, il est coché dans la liste. La plupart des autres n'ont besoin que d'un nettoyage minimal. SGEN est la principale exception ( @huanwu s'il vous plaît voir la question ci-dessus)

@zhenlan question ci-dessus à propos de Microsoft.XmlSerializer.Generator.dll - il contient 400 Ko de code mort (!) ... ce code est-il temporairement mort, ou avez-vous terminé ce travail et quelqu'un peut-il le supprimer? Je peux demander aux vendeurs de faire une grande partie du travail, très probablement. Faites le moi savoir.

@danmosemsft Ce n'est pas du code mort. La plupart du code est partagé avec System.Private.Xml. Si vous vérifiez le fichier de projet https://github.com/dotnet/corefx/blob/master/src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj , vous pouvez trouver la plupart des fichiers de code se trouvent sous $(SourceDir)SystemXmlSerialization

@huanwu même si nous ne pouvons pas supprimer le code du référentiel (car il est utilisé par d'autres) si le code n'est pas utilisé dans cet assembly, nous ne le compilerions idéalement pas dans l'assembly.
ReflectionAwareCodeGen
XmlSerializationWriterCodeGenXmlSerializationWriterCodeGen
XmlSerializationCodeGenXmlSerializationCodeGen
toutes semblent des classes mortes. Idéalement, ils pourraient être déplacés dans leurs propres fichiers de code afin qu'ils ne soient compilés que là où ils sont nécessaires.

ReflectionAwareCodeGen est en fait dans #if XMLSERIALIZERGENERATOR alors peut-être qu'il est totalement mort, s'il est mort dans cet assemblage.

De plus, la grande majorité des chaînes sont inutilisées dans ce binaire.

Si ce code est mort dans cet assemblage, cela permettrait d'économiser 400 Ko, cela en vaut donc la peine.

Salut @danmosemsft , je ne comprends peut-être pas entièrement comment le code mort est déterminé, mais quelque chose ne va pas.

Par exemple, le fichier diff Microsoft.XmlSerializer.Generator a marqué ReflectionAwareCodeGen en rouge, ce que j'ai interprété comme du code mort du point de vue des outils. Cependant, il est clairement utilisé dans Microsoft.XmlSerializer.Generator ici . Pouvez-vous s'il vous plaît aider à clarifier?

OK, je vois que l'outil a en fait marqué toute la chaîne de * CodeGen comme code mort. Veuillez ignorer ma question précédente et laissez-moi vous expliquer. Le projet Microsoft.XmlSerializer.Generator vient de faire son enregistrement initial. Certains codes ne sont morts que temporairement. Ils seront utilisés lorsque nous aurons plus de travail. Peut-être pouvons-nous réexécuter l'outil lorsque nous nous rapprochons de la fin du code ?

@zhenlan c'est exactement ce que je supposais. Le code complet était en fait la semaine dernière :) Peut-être s'agit-il d'un DCR. Y a-t-il beaucoup plus à faire ?

@danmosemsft oui ce que vous avez supposé est vrai :)

Microsoft.XmlSerializer.Generator (Sgen) est un outil CLI qui n'est pas livré avec .NET Core. Pour la partie du code que Sgen partage avec S.Private.Xml, je ne pense pas qu'il y ait de grosses lacunes à l'exception des corrections de bugs et nous visons 5/10 pour ZBB. Pour la partie du code qui est uniquement sous Sgen, il y a plus de travail de fonctionnalité à faire mais nous devrions avoir plus de marge de manœuvre en raison des différents véhicules de publication. J'espère que cela clarifie.

@erozenfeld une grande partie du code supprimable restant fait probablement partie de fichiers partagés communs que personne n'utilise. Sans analyser chacun à la main ou sans faire de fastidieux assemblage du CSV, il n'est pas possible de nettoyer ce code. Existe-t-il un moyen simple d'exécuter ILLink sur l'ensemble des assemblages, en fusionnant les fichiers utilisés dans plusieurs assemblages, afin que nous puissions obtenir l'un de ces rapports HTML montrant ce qui est mort dans le code commun ?

Nous voudrions également fusionner dans les assemblages de test car certains tests se compilent dans le code du produit (par exemple PathInternal.cs). Aussi ceux d'Unix parce qu'ils utilisent bien sûr du code commun.

@danmosemsft Mon outil peut le faire. c'est-à-dire Exécutez-le sur l'ensemble de la base de code, en supprimant automatiquement les lignes, y compris les faux positifs, construisez et revenez à plusieurs reprises, puis testez. Enfin, poussez-le vers mon compte Github et créez une demande d'extraction. Probablement un peu de travail impliqué, donc à ne pas tenter à moins qu'il ne soit utilisé. Voir https://github.com/dotnet/corefx/pull/18395 pour les résultats sur un sous-ensemble

@danmosemsft

Existe-t-il un moyen simple d'exécuter ILLink sur l'ensemble des assemblages, en fusionnant les fichiers utilisés dans plusieurs assemblages, afin que nous puissions obtenir l'un de ces rapports HTML montrant ce qui est mort dans le code commun ?

Non, il n'y a pas de moyen simple de le faire. ILLink fonctionne sur les assemblages, et non sur les fichiers source utilisés pour les générer.

@erozenfeld Je ne pense pas que c'était ce que je voulais dire. Je ne m'attends pas à ce qu'ILLink fonctionne sur des sources. Mais pour le moment, toutes les sources partagées qui s'affichent comme mortes dans le binaire X ne peuvent pas être facilement supprimées car elles peuvent être utilisées par le binaire Y ou Z. Si théoriquement toutes nos bibliothèques ont été compilées dans une grosse dll comme ILMerge ou similaire, avec les pdb corrigés de manière appropriée, nous pourrions supprimer tout code commun qui apparaît comme mort. Ma question était de savoir si ILMerge pouvait fusionner les assemblages en un seul, puis exécuter une analyse de fermeture sur celui-ci.

@danmosemsft Non, ILLink ne peut pas fusionner les assemblages en un seul comme le fait ILMerge. Je ne sais pas comment ILMerge gère les conflits de noms entre les assemblages. Si vous avez la classe NC dans l'assemblage A et la classe NC dans l'assemblage B, en général, vous devez conserver les deux (et renommer l'un ou les deux) lors de la fusion, sauf si vous pouvez prouver qu'ils sont identiques au sens profond.

Je t'ai eu. Eh bien peut-être qu'une approche émergera dans le futur. Ce n'est pas grave.

Il me vient aussi à l'esprit que cela pourrait être fait avec un traitement des CSV...

Toutes ces données sont probablement obsolètes maintenant. Nous devrions probablement relancer les rapports si vous voulez faire plus de travail à ce sujet. Vous pouvez trouver des instructions pour le faire dans la section de fond ci-dessus.

Dans System.Collections.Immutable et System.Collections.NonGeneric, le seul code marqué est soit des constantes utilisées, soit des méthodes dans des fichiers communs où d'autres méthodes de la même classe sont utilisées dans ce projet, elles ne nécessitent donc aucun travail supplémentaire.

Merci @YoupHulsebos , top post mis à jour.

Dans System.IO.FileSystem.Watcher et System.Security.Cryptography.Primitives, le seul code signalé est des constantes ou des méthodes utilisées dans des fichiers communs où d'autres méthodes de la même classe sont utilisées dans ce projet, elles ne nécessitent donc aucun travail supplémentaire.

@yaelkeemink remercie les cases à cocher mises à jour.

Bonjour,
En tant que premier contributeur, j'aimerais m'attaquer à la bibliothèque System.Net.Mail si cela vous convient !

Bien sûr, merci! Vas-y. Si vous rencontrez des barrages routiers, envoyez-nous un ping ici pour signaler de nouveaux problèmes (et marquez-moi pour le routage).

J'ai créé une demande d'extraction pour System.Net.Mail et signé l'accord.

Merci @Ermiar! Top-numéro mis à jour avec lien vers le PR.

Débutant ici - je vais prendre ce qui suit :

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

🗄

Génial, bienvenue à bord @garfbradaz !
Faites-nous savoir lorsque vous soumettez PR, nous mettrons à jour le message supérieur ( @ViktorHofer pouvez-vous s'il vous plaît aider aujourd'hui ?)

Sûr.

@garfbradaz s'il vous plaît assurez-vous après avoir supprimé le code mort possible pour exécuter tous les tests dans les deux projets pour Desktop et Core.
Vous pouvez le faire en exécutant d'abord :
build.cmd et build.cmd -framework:netfx à partir de la racine corefx et ensuite en exécutant les projets de test individuels comme ceci :
msbuild /t:RebuildAndTest et msbuild /t:RebuildAndTest /p:TargetGroup=netfx .

N'hésitez pas à me contacter si vous avez besoin d'aide. Merci pour ton aide!

Merci @ViktorHofer / @karelz - labourez lentement

Il y a eu un faux positif : dotnet/corefx#19826 est implémenté avec le code supprimé par le commit 81506698 sur ce problème. Bien que la méthode soit "morte" pour l'instant, il est essentiel d'être là pour ramener DbProviderFactories de .NET complet. Il sera donc ressuscité si le PR de dotnet/corefx#19826 est fusionné.

Contributeur pour la première fois, j'aimerais essayer System.Linq.Expressions.

Génial @mccbraxton ! Si vous avez besoin d'aide, contactez-moi.

@mccbraxton Il semble que System.Linq.Expressions soit déjà nettoyé. Voulez-vous prendre un autre morceau ?

@ViktorHofer Vous avez raison - vous avez dû mal lire. Que diriez-vous de System.Security.Cryptography.Algorithms ?

Cela semble bon! Je t'ai ajouté dans le tableau. Assurez-vous de ne pas supprimer le code utilisé par une cible. Merci pour ton aide!

dotnet/corefx#18162 s'est occupé de ce qui restait dans le rapport pour Microsoft.CSharp qui était vraiment mort.

Bonjour nouvelle contribution ici, je peux prendre System.ComponentModel.*

Merci @norek allez-y.

Salut ci-dessous résumé de System.ComponentModel.

  • root - Rien à supprimer
  • .Annotations - rien à supprimer
  • .EventBasedAsync - rien à supprimer
  • .Primitives - marqué comme mort mais ce n'est pas
  • .TypeConverters - je supprime du code. Mais je suis confus avec l'opérateur != - il est marqué comme mort mais je ne connais pas toutes vos conventions de codage - devrait également être supprimé ?

J'examinais la liste et j'ai trouvé du code mort dans System.Diagnostics - StackTraceSymbols est marqué comme mort mais le nom de cette classe dans l'explorateur de solution est StackTraceSymbols.CoreCLR.cs . J'ai trouvé dans les problèmes fermés : dotnet/corefx#19368
et c'est mort ou pas ?

@mikem8361 possédez -vous SDStackTraceSymbols ?

Je le possède et ce n'est pas du code mort. La réflexion est utilisée par System.Private.CoreLib pour charger cet assembly et référencer cette classe.

Ainsi, coreclr peut imprimer des informations sur les numéros de source/ligne sur les traces de pile d'exceptions non gérées.

@ mikem8361 merci pour l'information. Il semble qu'il soit protégé par illinktrim.xml :

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

@ericstj @erozenfeld pouvons-nous corriger le CSV émis par ILLink afin qu'il n'affiche pas le code comme mort lorsque nous l'avons forcé à conserver le code ?

Les fichiers CSV que nous avons ne sont que le diff après le découpage, ils n'ont donc pas de contenu explicitement enraciné. Les données liées dans ce numéro ne sont pas en ligne. C'est à partir d'une course unique lorsque j'ai ouvert le problème. Je suppose que si vous regardiez les informations en direct, cela ne s'afficherait plus comme un diff.

Bonjour, je suis un premier contributeur. J'aimerais essayer System.Net.Http et System.Net.HttpListener.

@soapdogg allez-y ..

@AlexGhiondea comme mentionné

Bonjour. Puis-je prendre Microsoft.VisulaBasic ?

@satano bien sûr, allez-y. Il semble qu'il n'y ait que quelques bits à supprimer (tous les champs const et ctor sans paramètre doivent rester, selon mon écriture ci-dessus). Peut-être pourriez-vous également utiliser CSharp ?

Certaines bibliothèques sont également nouvelles depuis que l'analyse ci-dessus a été effectuée...

OK, je vais faire CSharp et VisualBasic.

PR pour Microsoft.VisualBasic est prêt.

Concernant Microsoft.CSharp - tout ce qui est rouge dans le fichier diff est déjà supprimé. Alors marquez-le simplement dans le numéro.

Allons-nous laisser ce problème aux débutants ou puis-je continuer ?

@satano pouvez-vous s'il vous plaît trouver le changement qui a supprimé le diff rouge ?
Vous pouvez continuer, nous ne le réservons pas uniquement aux débutants.

Je ne sais pas si c'était tout, mais quelque chose a été supprimé ici : https://github.com/dotnet/corefx/commit/3eb339702e2fcdf924b50c2e32d7e9e02395e52f

@JonHanna l' a même dit ici https://github.com/dotnet/corefx/issues/17905#issuecomment -291924301

Je vais continuer du haut. Ensuite, je vais prendre System.IO.Compression , System.IO.FileSystem.AccessControl et System.IO.FileSystem .

@satano vas-y - pas besoin de demander la permission, si quelqu'un d'autre regardait, il posterait ici.

Un "méta-problème" intéressant pour quelqu'un est de savoir s'il existe un moyen d'utiliser le même outil de liaison pour trouver du code commun que personne n'utilise. Si une classe extraite de srccommon n'est que partiellement utilisée par une bibliothèque, elle apparaîtra morte dans cette analyse, mais elle ne pourra pas être supprimée car une autre bibliothèque pourrait l'extraire et l'utiliser. Ce que je pensais, c'est s'il existe un moyen de fusionner les assemblages, puis exécutez l'éditeur de liens sur eux. @erozenfeld pourrions-nous utiliser l'éditeur de liens pour fusionner, puis trouver du code mort sur le résultat ?

ILLink ne peut actuellement pas fusionner les assemblys. C'est quelque chose que nous envisageons d'ajouter à l'avenir. Il existe d'autres outils qui peuvent le faire : https://github.com/Microsoft/ILMerge et https://github.com/gluck/il-repack bien que je ne sois pas sûr qu'ils gèrent ce scénario comme nous le souhaitons. Ils peuvent ou non se rendre compte que les types/méthodes/champs avec des noms conflictuels représentent des entités identiques.

Je continue avec System.Net.Http , System.Net.HttpListener et System.Net.NetworkInformation .

Je vais prendre des System.Net.* entiers un par un.

Continuer avec le reste : System.Private.* , System.Runtime.* et System.Security.* .

@karelz

… pouvez-vous s'il vous plaît trouver le changement qui a supprimé le diff rouge ?

dotnet/corefx#18162

Eh bien... Il est probablement temps d'examiner ce problème et peut-être de le fermer ?

Le code mort de ces projets a été supprimé et fusionné :

  • Microsoft.CSharp (déjà fait plus tôt comme mentionné dans le commentaire ci-dessus)
  • Microsoft.VisualBasicMicrosoft.VisualBasic
  • System.IO.Compression
  • System.IO.FileSystem
  • System.IO.FileSystem.AccessControl
  • System.Net.Http
  • System.Net.HttpListener
  • System.Net.NetworkInformationSystem.Net.NetworkInformationSystem.Net.NetworkInformationSystem.Net.NetworkInformationSystem.Net.NetworkInformationSystem.Net.NetworkInformation
  • System.Net.Primitives
  • Requêtes System.Net
  • System.Net.Security
  • System.Net.Sockets
  • System.Net.WebClient
  • System.Net.WebSocket.Client
  • System.Private.DataContractSerialization
  • System.Private.Uri
  • System.Security.Cryptography.Cng
  • System.Security.Cryptography.Csp

J'ai aussi regardé le reste des projets et il n'y a rien à faire dedans :

  • System.Net.WebHeaderCollectionSystem.Net.WebHeaderCollection
  • System.Net.WebSockets
  • System.Runtime
  • System.Runtime.Serialization.PrimitivesSystem.Runtime.Serialization.Primitives
  • System.Security.AccessControl
  • Réclamations.de.sécurité.système
  • Système.Sécurité.Cryptographie.Algorithmes
  • Système.Sécurité.Cryptographie.Encodage
  • Système.Sécurité.Cryptographie.OpenSsl

Donc, le seul projet qui reste est Microsoft.XmlSerializer.Generator . Il a la plupart du code mort, mais comme mentionné dans certains commentaires ici, il y a un travail en cours là-bas - si j'ai bien compris.

Ce problème est-il terminé ? Sinon, pourrais-je prendre System.Console ?

@ Iroca88 bien sûr. Notez que les dumps liés ci-dessus peuvent être un peu obsolètes maintenant.

Merci @danmosemsft , une suggestion pour obtenir de nouveaux dumps ? Sinon, je vais commencer par les décharges fournies ci-dessus.

BTW: est @lroca88 , j'ai mis la première lettre (L) en majuscule afin d'éviter ce type de confusion :)

@ Lroca88 le post du haut explique comment accéder aux assemblages découpés et pré-découpés. Pour les différencier, nous avons utilisé un outil qui ne semble pas être public. Vous pouvez utiliser un décompilateur comme Ilspy On both et faire un diff textuel sur les résultats. Cela fonctionnerait probablement.

Je vais lancer un diff récent et le partager. Restez à l'écoute.

Voici le dernier :

  • [ ] [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, j'avais du mal avec l'ancienne liste ! 🔨

@ Lroca88 assurez-vous de lire les conseils de publication sur la façon de faire cette passe, évitez la confusion ..

Oups. J'ai raté deux bits nouvellement orphelins dans Microsoft.CSharp dans dotnet/corefx#26491. J'aurai ça bientôt.

Dans la nouvelle liste, System.Runtime, System.Web.HttpUtility, System.Linq et System.Linq.Queryable n'ont que des constantes qui ne sont pas vraiment mortes et du code partagé. System.Linq.Expressions a ceux-ci et quelques éléments utilisés dans les vues de débogage et les ressources utilisées avec des constantes de compilateur particulières et doivent donc être supprimés, de sorte que ces cinq éléments peuvent tous être cochés.

J'ai fusionné les bibliothèques examinées par @JonHanna et celles que j'ai examinées dans une liste. Je continuerai à mettre à jour la liste selon mon temps, si quelqu'un veut ajouter des éléments à cette liste, n'hésitez pas à me cingler !

Bibliothèque | Révisé par | Statut
-- | -- | --
Microsoft.CSharp (csv) | @JonHanna | dotnet/corefx#27104
Microsoft.VisualBasic (csv) | @Lroca88 | Rien à supprimer
Microsoft.Win32.Primitives (csv) | @Lroca88 | Rien à supprimer
Microsoft.Win32.Registry (csv) | @Lroca88 | Rien à supprimer
System.Collections.Concurrent (csv) | @Lroca88 | Rien à supprimer
System.Collections (csv) | @Lroca88 | Rien à supprimer
System.Runtime (csv) | @JonHanna | Rien à supprimer
System.Web.HttpUtility (csv) | @JonHanna | Rien à supprimer
System.Linq (csv) | @JonHanna | Rien à supprimer
System.Linq.Queryable (csv) | @JonHanna | Rien à supprimer

Merci @Lroca88 !

Cela ne me surprend pas qu'il ne reste plus beaucoup de code mort. Cependant, comme indiqué en haut, ce processus ne peut pas déterminer si le code dans srccommon est mort (car il peut apparaître mort dans un assembly mais pas dans un autre). Si vous souhaitez trouver un moyen de résoudre ce problème, vous trouverez probablement plus de code mort. Par exemple, il est peut-être possible d'ILMerge les assemblages, puis d'exécuter l'analyse du code mort sur eux. Ou, il peut être plus facile de post-traiter les CSV pour trouver le code commun qui est mort dans chacun d'eux. @ericstj avez-vous des idées ?

C'est un plaisir d'aider @danmosemsft ,
Je suis d'accord avec vous, à propos de l'amélioration de ce processus, d'après mes critiques, le code le plus signalé n'est pas mort, est soit const ou souvent utilisé dans une autre assemblée comme vous l'avez dit précédemment. Regarder ces faux positifs rend la chasse un peu fastidieuse à mon avis.

Malheureusement, je ne sais pas comment effectuer l'ILMerge et l'analyse du code mort ou post-traiter les CSV. Je suis prêt à apprendre/collaborer cependant, si vous voulez passer du temps à me donner des cours particuliers :)

Où en est-on avec ça ? Le PO est-il tenu au courant des cours terminés ou devrions-nous abandonner ce commentaire maintenant ?

@MisinformedDNA - utilisez https://github.com/dotnet/corefx/issues/17905#issuecomment -365349091 s'il vous plaît

Je ne sais pas comment effectuer l'ILMerge et l'analyse du code mort ou post-traiter les CSV. Je suis prêt à apprendre/collaborer cependant, si vous voulez passer du temps à me donner des cours particuliers :)

Je ne sais pas non plus et il faudrait que je réfléchisse/expérimente. En ce moment, je suis entièrement engagé dans la fermeture de la version 2.1, donc cela devra attendre un peu 😺

J'ai écrit un script pour charger tous les CSV, puis j'ai filtré uniquement les plus exploitables. J'ai trouvé 3 942 problèmes/opportunités.

J'ai maintenant l'intention d'examiner chacun des problèmes et de prendre les mesures appropriées. Vous pouvez suivre mes progrès et laisser des commentaires, si vous le souhaitez, sur https://github.com/MisinformedDNA/corefx/tree/clean-dead-code

Bien, j'ai hâte de voir ce @MisinformedDNA.

J'ai trouvé un problème avec l'analyse du code mort, qui montre soit un problème, soit une déficience de l'outil.

Le rapport indique que les éléments suivants peuvent être supprimés :

    Friend Enum vbErrors
        ObjNotSet = 91
        IllegalFor = 92
    End Enum

Mais ces Enums sont référencés ailleurs, regardons donc une branche possible :

    ' 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

La logique m'a amené à l'endroit où la première déclaration "Si" n'est jamais vraie. Mais cette instruction "If" est une vérification null , nous devrions donc supposer que quelqu'un passerait null et qu'il manque un cas pour déterminer le code mort. Et s'il y a un problème (ou plus) avec la détermination du code mort, alors un ou plusieurs des Enums peuvent ne pas être du code mort après tout.

tldr : Résumé

Question 1 : Pourquoi VbMakeIllegalForException n'est-il pas marqué pour la suppression, même s'il ne peut pas appeler l'énumération qui a été marquée pour la suppression.
Question 2 : Pourquoi les cas de test déterminent-ils le code mort, ne transmettant-ils pas des valeurs nulles pour tous les paramètres applicables ?

@ericstj

Les valeurs enum ont probablement été intégrées dans msil afin que l'outil ne les voie pas. Il en est de même pour les constantes. Rien ne doit être fait pour le code source dans ces cas.

Je viens de terminer la suppression du code mort pour System.Data.Common avec build.cmd src\System.Data.Common terminé avec succès. Jusqu'à présent, j'avais l'impression que je n'avais besoin que de travailler dans la bibliothèque dans laquelle je me trouvais et si la construction et les tests réussissaient, alors j'étais prêt à partir. Mais j'ai quand même décidé de faire une construction complète, et je suis content de l'avoir fait, car j'ai eu beaucoup d'erreurs.

Voici quelques exemples d'erreurs :

SystemDataSqlClientSqlCommandBuilder.cs(277,17) : erreur CS0117 : 'ADP' ne contient pas de définition pour 'RemoveStringQuotes' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataProviderBaseDbConnectionPool.cs(984,33) : erreur CS0117 : 'ADP' ne contient pas de définition pour 'SetCurrentTransaction' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
D:ReposcorefxsrcCommonsrcSystemDataProviderBaseDbMetaDataFactory.cs(409,21) : erreur CS0117 : 'ADP' ne contient pas de définition pour 'IsEmptyArray' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataCommonDbConnectionStringCommon.cs(180,27) : erreur CS0117 : 'ADP' ne contient pas de définition pour 'InvalidConnectionOptionValue' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]

Les membres manquants ont tous été clairement spécifiés pour être supprimés dans System.Data.Common.diff.html , mais non seulement ils provoquent des erreurs dans les classes enfants, mais il n'y a pas de fichiers diff pour ces classes enfants ou leurs assemblages associés comme System.Data.SqlClient .

La première erreur ci-dessus est liée à une méthode publique, SqlCommandBuilder.UnquoteIdentifier . Donc, je ne vois pas comment ADP.RemoveStringQuotes peut être supprimé de System.Data.Common sans un changement radical dans les autres classes.

Comment dois-je les gérer ? Des idées pourquoi ils sont marqués pour le retrait?

@anipik pouvez-vous aider @misinformeddna ici ?

@MisinformedDNA Vous devrez toujours créer l'intégralité du référentiel et exécuter les tests pour toutes les bibliothèques car il est possible qu'une bibliothèque dépende directement d'une autre bibliothèque (A utilisant un type de B) ou indirectement. (A utilisant un type de B qui utilise un type de C)
Il n'y a rien dans la fonction ADP.removeStringQuotes , isemptyarray , setTransaction qui soit spécifique à ApaterUtil ou System.Data.Common donc nous pouvons simplement le déplacer vers sqlCommandBuilder.cs en tant que méthode statique privée. Ils ne font que manipuler les arguments. Si vous pouviez m'indiquer la branche ayant cet échec, je peux vous aider avec d'autres échecs.

Toutes les méthodes que vous avez mentionnées ci-dessus sont internal static methods qui ne sont plus utilisées dans l'assembly où elles sont définies.
Les membres internes ne sont généralement pas destinés à être utilisés en dehors de l'assemblage dans lequel ils sont définis. mais dans certains cas, nous le faisons en utilisant l'attribut ``Internals Visible To```.

@danmosemsft déplace ces fonctions internes vers les assemblages où elles sont utilisées de manière optimale ?

Voici le fork sur lequel je travaille : https://github.com/MisinformedDNA/corefx/tree/clean-dead-code

Comme indiqué précédemment, l'analyse du code mort indique que ADP.RemoveStringQuotes pour System.Data.Common pourrait être supprimé. Cependant, étant donné que ADP était marqué internal , l'analyseur a peut-être supposé qu'il n'était pas utilisé en dehors de l'assemblage. Je ne sais pas s'il recherche l'attribut InternalsVisibleTo , mais cela n'aurait pas eu d'importance s'il l'avait fait, car il n'est pas utilisé ici. Au lieu de cela, il est partagé via des fichiers liés.

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

Je suppose que l'analyseur voit les différentes classes ADP comme des types séparés, au lieu de types partagés, car ils sont essentiellement dupliqués. Ainsi, bien que supprimer RemoveStringQuotes soit la bonne chose à faire pour System.Data.Common , c'est la mauvaise chose à faire lorsque l'on considère d'autres projets auxquels il est lié.

À moins que l'analyseur ne puisse déterminer que toutes ces classes proviennent du même fichier, nous penserons perpétuellement que nous avons du code mort dans certains de ces fichiers.

À moins que quelqu'un ait une meilleure suggestion, je commencerai à ajouter ces méthodes au code.

@MisinformedDNA j'en ai parlé avec @danmosemsft hors ligne. Une autre approche possible consiste à rendre la classe ADP partielle. Et puis vous pouvez déplacer ces fonctions vers ces bibliothèques.

J'ai déposé mon premier PR, mais 2 des builds ont échoué. Les deux échecs de construction semblent indiquer un délai d'attente. Quelle action dois-je entreprendre pour résoudre ce problème ?

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

Je vais regarder le System.Private.Uri

Voici une ou plusieurs applications que j'ai écrites pour télécharger tous les fichiers, les combiner, puis filtrer tous ceux qui sont probablement de faux positifs. J'espère que cela sera utile à d'autres.

@ericstj est-il judicieux de régénérer les données afin que nous ayons une image plus claire d'où nous en sommes ?

Démarré sur les espaces de noms suivants :

  • System.Collections.Specialized

    • Seulement 2 propriétés de CompatibleComparer, mais fichier dans src/common et plus large en cours d'utilisation.

  • System.Diagnostics.DiagnosticSource
  • System.Diagnostics.FileVersionInfoSystem.Diagnostics.FileVersionInfo
  • Système.Diagnostics.Processus
  • System.Diagnostics.StackTraceSystem.Diagnostics.StackTrace
  • System.Diagnostics.TextWriterTraceListenerSystem.Diagnostics.TextWriterTraceListener
  • System.Diagnostics.ToolsSystem.Diagnostics.ToolsSystem.Diagnostics.Tools
  • System.Diagnostics.TraceSourceSystem.Diagnostics.TraceSource
  • System.Diagnostics.TracingSystem.Diagnostics.Tracing

J'ai régénéré les données. La voici comme une nouvelle liste, je ne voulais pas écraser ce qui s'y trouvait au cas où les gens le trouveraient pertinent.

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

Merci Éric !

Vérifié les éléments suivants :

  • System.IO.Compression.Brotli
  • System.IO.Compression.ZipFile
  • System.IO.FileSystem.DriveInfo
  • System.IO.IsolatedStorageSystem.IO.IsolatedStorage
  • System.IO.MemoryMappedFiles
  • System.IO.Pipes
  • Mémoire système

Nettoyage du code mort pour :
System.Diagnostics.DiagnosticSource
System.Diagnostics.FileVersionInfoSystem.Diagnostics.FileVersionInfo
Système.Diagnostics.Processus
System.Diagnostics.StackTraceSystem.Diagnostics.StackTrace
System.Diagnostics.TextWriterTraceListenerSystem.Diagnostics.TextWriterTraceListener
System.Diagnostics.ToolsSystem.Diagnostics.ToolsSystem.Diagnostics.Tools
System.Diagnostics.TraceSourceSystem.Diagnostics.TraceSource
System.Diagnostics.TracingSystem.Diagnostics.Tracing
System.Drawing.PrimitivesSystem.Drawing.PrimitivesSystem.Drawing.Primitives

dotnet/corefx#33095

J'aimerais prendre le nettoyage de System.IO.Compression comme première contribution.

Dans le post de départ System.Console marqué comme terminé, mais dans les données régénérées, il n'est pas marqué. J'ai trouvé que seules quelques chaînes SR doivent être effacées.
Alors, @ericstj , est-ce une sorte d'erreur ou je peux jeter un coup d'œil sur d'autres bibliothèques et corriger de si petits codes morts ?

Résumé

J'ai créé un petit outil qui supprime certaines choses inutiles de ces données .


Il supprime :

  1. Tous les const qui sont marqués en rouge.

C'est très courant. Tout ce qui contient "const", veuillez l'ignorer. Ce sont tous des champs intégrés par le compilateur, nous voulons les conserver dans les sources. Généralement des entiers et des chaînes.

  1. Toutes les choses qui ne sont pas marquées en rouge (ce code n'est pas mort).

Il reste:

  1. Toute classe ou structure de niveau d'imbrication contenant du code mort. Cela aide à trouver ce code plus rapidement.
  2. Toutes les chaînes SR qui peuvent être supprimées. Mais les méthodes SR ne sont pas supprimées non plus, soyez conscient.

Tout ce qui est "chaîne statique" dans "classe SR" est spécial. Au lieu de modifier un fichier C #, vous devez rechercher l'entrée correspondante dans le fichier .resx et la supprimer. Le fichier .resx d'une bibliothèque est dans srcsrcResourcesstrings.resx. La construction régénérera SR après cela. Ignorez tout le reste dans "classe SR" - il existe plusieurs méthodes qui peuvent apparaître comme mortes.

  1. Classes avec un seul constructeur sans paramètre. Cela permet d'éviter de faire quoi que ce soit avec eux.

Ignorez tous les constructeurs privés sans paramètre. Nous les avons dans le code pour éviter d'instancier accidentellement la classe, nous voulons les conserver dans le code.

Ignorez tous les constructeurs publics sans paramètre s'il n'y a pas d'autres constructeurs. Ce ne sont pas réels.


Aussi:

Vous pouvez trouver les fichiers effacés ici . Mentionnez-moi après la mise à jour des données et je mettrai à jour cela.

@ericstj est-il sûr de supprimer internal enum ?

Après avoir utilisé cet outil , j'ai vérifié tous les assemblages. Certains d'entre eux n'ont pas de code mort.
La liste mise à jour ressemble à quelque chose comme ci-dessous. Je change les liens vers htmlpreview pour les fichiers effacés du référentiel de l'outil . J'espère que personne ne s'en souciera.

Alors, @ericstj , est-ce une sorte d'erreur ou je peux jeter un coup d'œil sur d'autres bibliothèques et corriger de si petits codes morts ?

Lors de la régénération des diffs, j'ai recommencé avec tout effacé. Le mécanisme pour faire les différences de code mort est trop manuel. Il utilise un outil interne pour les diffs d'assemblage.

@ericstj est-il sûr de supprimer l'énumération interne ?

Cela dépend de ce qui est fait avec cette énumération interne. Les énumérations apparaîtront souvent comme mortes dans le binaire puisque le compilateur transforme leur référence source en littéraux entiers. Vous constaterez probablement que la source peut encore en avoir besoin.

Juste quelques réflexions sur la façon dont nous pouvons faire de ce nettoyage de code mort une meilleure expérience qui est plus stable à l'avenir.

  1. Ajoutez un outil différent à l'ouverture. J'utilise AsmDiff qui est interne. Nous pourrions l'ouvrir ou créer quelque chose de nouveau en plus des bibliothèques existantes (SRM, CCI ou Cecil).
  2. Autorisez les projets à accepter cette validation sans code mort et supprimez les éléments qui manquent à l'outillage.
  3. Itérer sur 2 en mettant des heuristiques dans des règles de différenciation et/ou de filtrage.
  4. Une fois que nous avons suffisamment de fonctionnalités dans l'outillage, activez-le pour l'ensemble du référentiel, validez les lignes de base où nous autorisons le code mort et n'aurez plus jamais à revenir sur ce problème 😄

Aujourd'hui, le mécanisme que nous utilisons pour le code mort arborescent est le lieur qui opère sur les binaires. Donc, pour mapper cela vers la source, nous différons sa sortie avec l'entrée et émettons les identifiants. Une autre chose dont j'ai discuté avec les gens de l'éditeur de liens dans le passé est d'émettre plus de journalisation qui pourrait plus directement correspondre aux choses qui intéressent nos développeurs. Il fonctionne également sur des PDB, il possède donc techniquement tout le code source et les informations de ligne.

@ericstj est-il techniquement possible de fonctionner sur corelib ? J'ai remarqué une méthode morte dans corelib, et il y en a sans doute d'autres. Certes, il aurait besoin de soins étant donné tous les rappels de la VM

@danmosemsft Il fonctionne déjà sur System.Private.Corelib.dll dans le cadre de la construction coreclr. Quelle est la méthode morte que vous avez remarquée et qui n'est pas supprimée ?

@ericstj Je suppose que nous pouvons fermer ça?

Je pense que c'est fait pour le moment. Un grand merci à tous ceux qui ont contribué à améliorer notre base de code !

Cette page vous a été utile?
0 / 5 - 0 notes