Runtime: Limpiar código muerto

Creado en 5 abr. 2017  ·  152Comentarios  ·  Fuente: dotnet/runtime

Después de habilitar el enlazador mono para nuestros binarios .NETCoreApp, identificó varios lugares donde tenemos código inactivo.

Estos se dividen en 3 categorías.

  1. Código verdaderamente muerto que no se usa en ninguna parte del ensamblaje.

    • esto se puede borrar

  2. Archivos de origen que se utilizan en una compilación del ensamblaje, pero no en todos. Archivos fuente comunes donde algún proyecto usa la fuente, pero no todos.

    • Estos pueden factorizarse mejor, dividirse para proporcionar una fuente mínima donde sea necesario. O bien, pueden contener código verdaderamente inactivo.

  3. Fuente de tiempo de compilación solamente. Constantes internas que se representan como literales al llamar a IL y no se exponen públicamente.

    • Estos deben permanecer.

diferencias

  • [ ] [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 por @YoupHulsebos
  • [x] [System.Collections.Immutable](http://tempcoverage.blob.core.windows.net/report2/System.Collections.Immutable.diff.html) ( csv ) - Nada que eliminar por @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 ) - Nada que eliminar @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 ) - Corregido en dotnet/corefx#19141 por @ 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] [Sistema.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 ) - Nada que eliminar, https://github.com/dotnet /corefx/issues/17905#issuecomment-294286344 por @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 ) - Corregido en dotnet/corefx#19143 por @ YoupHulsebos
  • [x] [System.Linq.Queryable](http://tempcoverage.blob.core.windows.net/report2/System.Linq.Queryable.diff.html) ( csv ) - Nada que eliminar - https://github .com/dotnet/corefx/issues/17905#issuecomment-294286344 por @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 ) - Corregido en dotnet/corefx#19532 por @ 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] [Sistema.Privado.Xml](http://tempcoverage.blob.core.windows.net/report2/System.Private.Xml.diff.html) ( csv )
  • [x] [Sistema.Privado.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 ) - Corregido en dotnet/corefx #19148 por @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
  • [ ] [Sistema.Seguridad.Cryptografía.Cng](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Cng.diff.html) ( csv )
  • [ ] [Sistema.Seguridad.Cryptografía.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 ) - Corregido en dotnet/corefx #19144 por @yaelkeemink
  • [x] [System.Security.Principal](http://tempcoverage.blob.core.windows.net/report2/System.Security.Principal.diff.html) ( csv ) - Nada para eliminar
  • [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 ) - Nada que eliminar
  • [x] [System.Threading.Tasks.Parallel](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Tasks.Parallel.diff.html) ( csv ) - Nada que eliminar
  • [x] [System.Threading.Thread](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Thread.diff.html) ( csv ) - Nada que eliminar
  • [x] [Sistema.Transacciones.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 ) - Nada que eliminar
  • [x] [System.Xml.XPath.XDocument](http://tempcoverage.blob.core.windows.net/report2/System.Xml.XPath.XDocument.diff.html) ( csv ) - Nada que eliminar

antecedentes

Los informes se generaron habilitando ILLink (construcción de un enlazador mono del equipo de codegen /cc @erozenfeld) y comparando la salida.

Las diferencias son de una compilación de Windows y están restringidas solo a ensamblajes que forman parte de NETCore.App.

Cuando el enlazador está habilitado, producirá una carpeta "PreTrim" en la carpeta de objetos de un ensamblaje, por ejemplo, <corefx>\bin\obj\AnyOS.AnyCPU.Debug\Microsoft.CSharp\netstandard\PreTrim\Microsoft.CSharp.dll .

Para habilitar una copia central de los ensamblajes recortados, puede establecer la propiedad BinPlaceILLinkTrimAssembly=true . Esto copiará todos los ensamblajes precortados y recortados en una carpeta debajo del contenedor: <corefx>\bin\ILLinkTrimAssembly\netcoreapp-Windows_NT-Debug-x64 .

Para generar los informes vinculados en este número debe tener una copia de la herramienta AsmDiff.exe. Esta herramienta aún no está disponible para Core, consulte (https://github.com/dotnet/buildtools/issues/1420). Si tiene la versión de escritorio de la herramienta, puede habilitar los informes configurando AsmDiffCmd=<pathToAsmDiff.exe>

El enlazador se puede habilitar para cualquier proyecto (no solo para aquellos en NETCore.App) al construir con ILLinkTrimAssembly=true después de fusionar https://github.com/dotnet/corefx/pull/17825.

como abordar una biblioteca

Elija una biblioteca y anote que va a trabajar en ella.

Abra el informe html de arriba para la biblioteca. Busque líneas en rojo. Estos están teóricamente muertos. Busque el código en la carpeta src de este repositorio y elimínelo. Continúe con el informe de la biblioteca y elimine todo el código muerto como ese.

PERO hay algunos casos especiales:

  1. Este es uno muy común. Cualquier cosa con "const", por favor ignorar. Estos son todos los campos alineados por el compilador, queremos mantenerlos en las fuentes. Típicamente enteros y cadenas.
  2. Cualquier cosa que sea "cadena estática" en "clase SR" es especial. En lugar de editar un archivo C#, debe encontrar la entrada correspondiente en el archivo .resx y eliminarla. El archivo .resx para una biblioteca está en src\<library>\src\Resources\strings.resx . La compilación regenerará SR después de hacer esto. Ignore cualquier otra cosa en la "clase SR": hay varios métodos que pueden aparecer como inactivos.
  3. Ignore cualquier constructor privado sin parámetros. Los tenemos en el código para evitar instanciar accidentalmente la clase, queremos mantenerlos en el código.
  4. Ignore los constructores públicos sin parámetros si no hay otros constructores. Estos no son reales.
  5. Parte del código no estará en la carpeta de la biblioteca, estará en src\common. Es posible que este código no esté realmente muerto porque otra biblioteca puede usarlo. Idealmente, grep para ver si alguien más en el árbol lo usa; si es así, se puede eliminar. O ignórelo y podemos hacer otro pase más tarde.
  6. Si el código solo se usa en Unix, UAP, etc., no lo elimine. Es probable que no esté muerto. Puede saber si es de este tipo si está rodeado, por ejemplo, de #if uap o si tiene una condición en el archivo .csproj como, por ejemplo '$(TargetGroup)' == 'uap'"

Una vez que haya eliminado el código inactivo de una biblioteca, asegúrese de que se compila (ejecute "msbuild" en la carpeta "src" de la biblioteca). Si no es así, retrocede. Si se compila, luego verifique la compilación y aprobación de las pruebas (ejecute “msbuild /t:buildandtest” en la carpeta “tests”). Nuevamente, si no lo hacen, vuelva sobre sus pasos.

Si todo se ve bien, puede poner un PR para la biblioteca. Cuando entre el PR, podemos marcarlo aquí.

area-Meta easy enhancement untriaged up-for-grabs

Todos 152 comentarios

Aquí hay una tabla que enumera la diferencia en bytes, en orden descendente. XML ya tiene un problema

| | | |
|----------------------------------------------------------------- ------|---------------|------------|
| Biblioteca | Bytes eliminados | % disminución |
| TOTALES | 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.Extensiones.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.Cliente.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.Compresión.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% |
| Sistema.Seguridad.Cryptografía.Csp.dll | 8704 | 9,83% |
| System.Security.AccessControl.dll | 8192 | 7,69% |
| Sistema.Seguridad.Cryptografía.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.Expresiones.dll | 6656 | 1,03% |
| Sistema.Seguridad.Principal.Windows.dll | 6656 | 9,29% |
| Microsoft.Win32.Registry.dll | 6144 | 12,77% |
| Sistema.Privado.Uri.dll | 6144 | 5,41% |
| System.Net.WebClient.dll | 5632 | 8,27% |
| Sistema.Privado.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.Anotaciones.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.Compresión.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% |
| Sistema.Seguridad.Cryptografía.OpenSsl.dll | 512 | 6,25% |
| System.Xml.XmlSerializer.dll | 512 | 5,56% |
| System.Xml.XPath.XDocument.dll | 512 | 6,67% |

Este es un tema muy fácil de entender para un nuevo colaborador. Simplemente abra uno de los archivos htm y elimine las fuentes marcadas en rojo.

Una cosa obvia que salta a la vista es que la clase SR generada casi siempre tiene varios miembros que no se usan, y aparece en todos (o al menos en la mayoría) de nuestros ensamblajes. Eso podría brindarnos algunas mejoras globales fáciles si descubrimos cómo solucionarlo.

También veo que en algunos casos aparecen campos private const . Son utilizados por la implementación de esa clase, pero obviamente no son visibles ni se utilizan fuera. Probablemente no valga la pena tratar de "arreglar" esos problemas.

Si se puede acceder a la implementación de la clase que usa los campos private const a través de un punto de entrada visible fuera del ensamblado, los campos no se eliminan.

Presumiblemente, si alguna biblioteca tiene componentes internos visibles (por ejemplo, para pruebas unitarias), veríamos falsos positivos, ¿verdad?

Si el ensamblado tiene InternalsVisibleTo, entonces todos los elementos internos también se consideran raíces.

está bien. Creo que hay algunos casos en los que las pruebas usan la reflexión para obtener elementos internos. Pero se descubrirán rápidamente cuando realicemos pruebas.

@mellinoe

Una cosa obvia que salta a la vista es que la clase SR generada casi siempre tiene varios miembros que no se usan, y aparece en todos (o al menos en la mayoría) de nuestros ensamblajes. Eso podría brindarnos algunas mejoras globales fáciles si descubrimos cómo solucionarlo.

Ya hice un pase en febrero eliminando cientos de cadenas muertas. Quedarán muy pocos. Creo que estos son casos en los que el método que hace referencia a la cadena se recorta. En cuyo caso, por supuesto, el resx debe recortarse.

@danmosemsft me refiero a este bloque de miembros que siempre se emite en el archivo generado:

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

A menudo (al menos por mi breve lectura 😄), solo se usa el primero y ocasionalmente el segundo. En algunos de los que hice clic, esta fue la parte más grande de la diferencia.

está bien. Creo que hay algunos casos en los que las pruebas usan la reflexión para obtener elementos internos. Pero se descubrirán rápidamente cuando realicemos pruebas.

Ya he cubierto la mayoría de ellos: https://github.com/dotnet/corefx/pull/17825/commits/2277db969616a5ad4fd9f4a8118a3b4030ff62d3

Ya estamos limpios por dentro y por fuera.

El informe de Dataflow dice que los tipos en el espacio de nombres System.Threading.Tasks.Dataflow.Internal.Threading están muertos. Eso no es cierto, están muertos en la configuración predeterminada, pero hay otras configuraciones que los usan. Consulte https://github.com/dotnet/corefx/pull/17912 para mi cambio propuesto.

¿Es probable que haya otros tipos como ese? ¿Hay algo que se deba hacer con ellos?

Este informe es solo para NETCoreApp en Windows. Es posible que otra configuración aún los use y eso sería detectado por la compilación -allConfigurations si alguien intentara eliminarlos por completo. Para casos como este, podría mejorar la configuración de NETCoreApp definiendo/dividiendo la fuente como mencioné en el punto 2 anterior. Esto se parece a lo que estás haciendo en dotnet/corefx#17912

Si está interesado en identificar la diferencia para otras configuraciones en las que no estamos ejecutando el enlazador, puede activarlo usando los detalles que mencioné en la sección de antecedentes. Esto será más fácil una vez que se fusione el PR, por lo que es posible que desee esperar.

@erozenfeld No querremos eliminar ninguna constante simplemente porque el compilador las insertó, porque eso pierde claridad en el código. Pero algunas de las constantes realmente están muertas, y probablemente queramos eliminarlas.

Por ejemplo, en http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.TypeConverter.diff.html la totalidad de VSStandardCommands está marcada como inactiva. Algunos son visibles (a través public class StandardCommands ), y solo están en línea. Pero algunos están realmente muertos, por ejemplo cmdidThisWindow

Sería bueno poder ver cuáles están en la última categoría.

Correcto, no podemos eliminar las constantes insertadas por el compilador de la fuente. ILLink opera en msil y no puede distinguir una constante verdaderamente inactiva de una constante que quedó inactiva ya que se ha integrado en todas partes.

También marca como muertos cualquier constructor predeterminado privado, que no queremos eliminar en general, ya que están ahí para evitar cualquier construcción accidental sin parámetros. Supongo que es inevitable, por la misma razón. Por lo que puedo pensar, no tienen ningún propósito después del tiempo de compilación.

Marcado como 'fácil' según la discusión anterior. Planeo señalar algunos contribuyentes primerizos a este problema.

Si alguien elige un archivo, por favor dígalo sobre este tema, para evitar la duplicación de trabajo.

@danmosemsft , ¿quieres agregar el instructivo que enviaste a los proveedores aquí también? Tal vez sería mejor agregarlo a la publicación superior, con todas las excepciones / cosas que se deben evitar ...

@karelz hecho

He echado un vistazo superficial a las diferencias. Hay demasiado ruido en ellos, fue difícil para mí encontrar algo fácil y procesable. ¿Podemos filtrar el ruido de las diferencias (consts, constructores privados sin parámetros, ...) para que tenga solo los elementos fáciles de accionar?

Puede abrir los CSV y aplicar el filtro que desee.

Sería bueno jugar con el CSV maestro para ver qué código en /src/common está realmente muerto.

@erozenfeld Puede que me esté perdiendo algo aquí. dice en http://tempcoverage.blob.core.windows.net/report2/System.Reflection.DispatchProxy.diff.html que EventAccessorInfo.InterfaceRaiseMethod está muerto, pero está configurado en el constructor, que en sí mismo no es muerto.
https://github.com/dotnet/corefx/blob/master/src/System.Reflection.DispatchProxy/src/System/Reflection/DispatchProxyGenerator.cs#L919

Eliminación disponible y fácil, no creo que esté lista (siéntase libre de cambiar si cree que me equivoco)

No veo cómo no está listo, las instrucciones son bastante claras... creo que es una buena introducción. De todos modos, la gente del vendedor comenzará con eso. Ya hice algunos y marqué muchos que ya están limpios.

Otra cosa que marca incorrectamente como muerta: cadenas que se cargan en tiempo de ejecución a través de SR.GetResourceString("..."). Desafortunadamente, todavía hay algunos, por ejemplo return SR.GetResourceString("PropertyCategory" + value, null);

Eso tiene que quedar atrapado en la revisión del código.

Al hojear el hilo, parecía que había preocupación por el ruido en los resultados. Nuevamente, no me siento muy fuerte, siéntete libre de darle la vuelta ;-)

Está bien :)

En System.Transactions.Local, hay un código al que actualmente no se accede, pero eventualmente se accederá a una parte de él una vez que hagamos el trabajo para admitir transacciones distribuidas. Soy reticente a simplemente eliminar este código.

Ya eliminé parte del código inactivo identificado aquí en Microsoft.CSharp y algunos más (el análisis no detectó que, por ejemplo ExpressionBinder.BindPtrToArray está inactivo según dotnet/corefx#17948) y el resto está en mi vistas como parte de mi refactorización en curso de ese ensamblaje.

@danmosemsft Con respecto a EventAccessorInfo.InterfaceRaiseMethod: dice que get_InterfaceRaiseMethod está muerto y dado que no hay set_InterfaceRaiseMethod, la propiedad está muerta. El código en el constructor establece el campo de respaldo generado por el compiladork__BackingField e ILLink mantienen el campo.

@jimcarley eso tiene sentido, verifiqué S.Transactions.Local arriba como hecho. Supongo que si hay probabilidades y extremos que en realidad están muertos, es posible que desee eliminarlos en algún momento.

@JonHanna si cree que ILLink debería haber sido capaz de detectar que el código estaba muerto, se lo haría saber a @erozenfeld .

@danmosemsft Estaría muy impresionado si pudiera, solo quise decir que los bits mencionados aquí ya son un subconjunto de las eliminaciones que pretendo hacer, por lo que ese elemento de la lista se cubrirá.

@danmosemsft @JonHanna ILLink no intenta encontrar código inalcanzable dentro de los métodos. Si un método es accesible, se supone que todas las instrucciones dentro del método son accesibles.

En beneficio de los demás: surgió otro caso sin conexión, en el que un constructor que estaba marcado como inactivo asignaba un campo int. Sin embargo, ese campo se estaba leyendo en otro lugar, y una vez que se eliminó ese constructor, el compilador advirtió que el campo nunca se configuraría. El lector estaba leyendo el valor predeterminado. En tal caso, el campo debe inicializarse explícitamente al eliminar el setter muerto.

@erozenfeld este código parece muerto: https://github.com/dotnet/corefx/compare/master...danmosemsft:dead.xml?expand=1
pero no fue marcado como muerto. Está en el IL (fields in struct). ¿ILLink evita específicamente eliminar campos de estructuras en caso de que, por ejemplo, se utilicen en interoperabilidad?

En este caso particular, los campos se inicializan en el constructor estático implícito, por lo que parece que se usan en la IL. Para detectarlos como código muerto, ILLink tendría que:

  • Detectar que los campos están asignados en el constructor estático y el valor no se usa en ningún otro lugar
  • La asignación de estos campos no tiene efectos secundarios
  • Vuelva a escribir el cuerpo del método del constructor estático para eliminar la asignación de estos campos, pero mantenga todo lo demás intacto.

Ah, por supuesto.

Noté estos como estaban en https://github.com/dotnet/corefx/pull/18395/files .. otros hallazgos en hay varias constantes que están muertas (lo que, por supuesto, ILLink no puede decir, ya que muestra todas las constantes como muerto) y algunas cosas como inicializaciones que solo un humano podría decir que no tienen efectos secundarios. Nada que ILLink debería haber encontrado.

@huanwu , la herramienta SGEN tiene 400 KB de código muerto.
¿Es razonable eliminar todo esto o es un trabajo en progreso, vas a usar este código?

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

En System.Linq y System.Linq.Queryable, el único código marcado son constantes o métodos usados ​​en archivos comunes donde se usan otros métodos de la misma clase en ese proyecto, por lo que no requieren más trabajo.

Acabo de identificar un código muerto usando una herramienta que he escrito; consulte https://github.com/dotnet/corefx/pull/18395. Estoy usando su código como datos de entrada para validar mi código.

En el pasado, realicé una eliminación masiva en Roslyn (18.5 kloc) que ha sido bueno para identificar el código que no debería estar muerto; consulte los comentarios en https://github.com/dotnet/roslyn/pull/17630. es decir, solo se usa en el depurador, debido a una regresión, la implementación incompleta de las pruebas debe compilarse condicionalmente.

@JonHanna gracias! Publicación superior actualizada con tu información.

dotnet/corefx#18414 eliminó la mayor parte del código muerto relevante en S.Linq.Expressions. Aparte de las constantes, etc., todavía hay algunas que podrían volverse relevantes si se transfieren funciones actualmente no admitidas (incluida una con un problema que solicita solo eso), por lo que probablemente sería mejor no hacer más ahora.

Suena bien, está marcado en la lista. La mayoría del resto solo necesita una limpieza mínima. SGEN es la principal excepción ( @huanwu , consulte la pregunta anterior)

@zhenlan pregunta anterior sobre Microsoft.XmlSerializer.Generator.dll: tiene 400 KB de código inactivo (!) ... ¿este código está temporalmente inactivo o ha terminado con este trabajo y alguien puede eliminarlo? Lo más probable es que pueda pedirles a los proveedores que hagan gran parte del trabajo. Sólo házmelo saber.

@danmosemsft Estos no son códigos muertos. La mayor parte del código se comparte con System.Private.Xml. Si revisa el archivo del proyecto https://github.com/dotnet/corefx/blob/master/src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj , puede encontrar que la mayoría de los archivos de código se encuentran en $(SourceDir)SystemXmlSerialización

@huanwu incluso si no podemos eliminar el código del repositorio (porque lo usan otros), si el código no se usa dentro de este ensamblaje, idealmente no lo compilaríamos en el ensamblaje.
ReflectionAwareCodeGen
XmlSerializationWriterCodeGen
XmlSerializationCodeGen
todas parecen clases muertas. Idealmente, podrían moverse a sus propios archivos de código para que solo se compilen donde se necesitan.

ReflectionAwareCodeGen en realidad está dentro #if XMLSERIALIZERGENERATOR por lo que tal vez esté totalmente muerto, si está muerto en este ensamblaje.

Además, la gran mayoría de las cadenas no se utilizan en este binario.

Si este código está muerto en este ensamblaje, se ahorrarían 400 KB, por lo que vale la pena hacerlo.

Hola @danmosemsft , es posible que no entienda completamente cómo se determina el código muerto, pero algo se siente mal.

Por ejemplo, el archivo diff Microsoft.XmlSerializer.Generator marcó ReflectionAwareCodeGen como rojo, lo que interpreté como código muerto desde el punto de vista de las herramientas. Sin embargo, se usa claramente en Microsoft.XmlSerializer.Generator aquí . ¿Puedes ayudar a aclarar?

Bien, veo que la herramienta en realidad marcó toda la cadena de *CodeGen como código inactivo. Ignora mi pregunta anterior y déjame explicarte. El proyecto Microsoft.XmlSerializer.Generator acaba de tener su registro inicial. Algunos códigos solo están muertos temporalmente. Se utilizarán cuando tengamos más trabajo hecho. ¿Tal vez podamos ejecutar la herramienta nuevamente cuando nos acerquemos al código completo?

@zhenlan eso es exactamente lo que supuse. El código completo fue la semana pasada en realidad :) Tal vez esto sea un DCR. ¿Hay mucho más que hacer?

@danmosemsft sí, lo que asumiste es correcto :)

Microsoft.XmlSerializer.Generator (Sgen) es una herramienta CLI que no se incluye como parte de .NET Core. Para la parte del código que Sgen comparte con S.Private.Xml, no creo que haya grandes lagunas, excepto las correcciones de errores, y nuestro objetivo es 5/10 para ZBB. Para la parte del código que está únicamente bajo Sgen, hay más funciones por hacer, pero deberíamos tener más libertad de acción debido a los diferentes vehículos de lanzamiento. Espero que esto aclare.

@erozenfeld gran parte del código eliminable restante probablemente sea parte de archivos compartidos comunes que nadie usa. Sin analizar cada uno a mano o hacer alguna unión tediosa del CSV, no es posible limpiar ese código. ¿Hay alguna forma sencilla de ejecutar ILLink en todo el conjunto de ensamblajes, fusionando archivos que se usan en múltiples ensamblajes, para que podamos obtener uno de estos informes HTML que muestre lo que está muerto en el código común?

También nos gustaría fusionar los ensamblajes de prueba, ya que algunas pruebas se compilan en el código del producto (p. ej., PathInternal.cs). También los de Unix porque por supuesto usan código común.

@danmosemsft Mi herramienta puede hacer eso. es decir, ejecútelo en todo el código base, eliminando automáticamente las líneas, incluidos los falsos positivos, construya y revierta repetidamente y luego pruebe. Finalmente, envíelo a mi cuenta de Github y cree una solicitud de extracción. Probablemente implica un poco de trabajo, por lo que no debe intentarse a menos que se use. Consulte https://github.com/dotnet/corefx/pull/18395 para obtener resultados en un subconjunto

@danmosemsft

¿Hay alguna forma sencilla de ejecutar ILLink en todo el conjunto de ensamblajes, fusionando archivos que se usan en múltiples ensamblajes, para que podamos obtener uno de estos informes HTML que muestre lo que está muerto en el código común?

No, no hay una forma sencilla de hacerlo. ILLink opera en ensamblajes, no en archivos de origen utilizados para generarlos.

@erozenfeld No creo que eso fuera lo que quise decir. No espero que ILLink opere sobre fuentes. Pero en este momento, las fuentes compartidas que se muestran como inactivas en el binario X no se pueden eliminar fácilmente porque pueden ser utilizadas por el binario Y o Z. Si, en teoría, todas nuestras bibliotecas se compilaron en un gran archivo DLL como ILMerge o similar se hubiera ejecutado, con los pdb corregidos correctamente, entonces podríamos eliminar cualquier código común que apareciera como inactivo. Mi pregunta era si ILMerge podría fusionar los ensamblajes en uno y luego ejecutar un análisis de cierre sobre ese.

@danmosemsft No, ILLink no puede fusionar ensamblajes en uno como lo hace ILMerge. No sé cómo maneja ILMerge los nombres en conflicto en los ensamblajes. Si tiene la clase NC en el ensamblaje A y la clase NC en el ensamblaje B, en general, debe mantener ambos (y cambiar el nombre de uno o ambos) al fusionarlos, a menos que pueda demostrar que son idénticos en un sentido profundo.

Entendido. Bueno, tal vez surja un enfoque en el futuro. No es gran cosa.

También se me ocurre que podría hacerse con algún procesamiento de los CSVs...

Es probable que todos estos datos estén desactualizados ahora. Probablemente deberíamos volver a ejecutar los informes si desea trabajar más en esto. Puede encontrar instrucciones sobre cómo hacerlo en la sección de antecedentes anterior.

En System.Collections.Immutable y System.Collections.NonGeneric, el único código marcado son constantes o métodos usados ​​en archivos comunes donde se usan otros métodos de la misma clase en ese proyecto, por lo que no requieren más trabajo.

Gracias @YoupHulsebos , publicación principal actualizada.

En System.IO.FileSystem.Watcher y System.Security.Cryptography.Primitives, el único código marcado son constantes o métodos usados ​​en archivos comunes donde se usan otros métodos de la misma clase en ese proyecto, por lo que no requieren más trabajo.

@yaelkeemink gracias casillas de verificación actualizadas.

Hola,
Como colaborador por primera vez, me gustaría abordar la biblioteca System.Net.Mail si está bien.

¡Seguro gracias! Avanzar. Si encuentra algún obstáculo, envíenos un ping aquí para presentar nuevos problemas (y etiquéteme para el enrutamiento).

Creé una solicitud de extracción para System.Net.Mail y firmé el acuerdo.

Gracias @Ermiar! Tema principal actualizado con enlace al PR.

Principiante aquí: tomaré lo siguiente:

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

🗄

Impresionante, ¡bienvenido a bordo @garfbradaz!
Háganos saber cuando envíe PR, actualizaremos la publicación principal ( @ViktorHofer , ¿puede ayudarnos hoy?)

Seguro.

@garfbradaz , después de eliminar el posible código muerto, asegúrese de ejecutar todas las pruebas en ambos proyectos para Desktop y Core.
Puedes hacer esto ejecutando primero:
build.cmd y build.cmd -framework:netfx desde la raíz de corefx y luego ejecutando los proyectos de prueba individuales como este:
msbuild /t:RebuildAndTest y msbuild /t:RebuildAndTest /p:TargetGroup=netfx .

No dude en ponerse en contacto conmigo si necesita ayuda. ¡Gracias por tu ayuda!

Gracias @ViktorHofer / @karelz - avanzando lentamente

Hubo un falso positivo: dotnet/corefx#19826 se implementó con el código eliminado por la confirmación 81506698 sobre este problema. Aunque el método está "muerto" por ahora, es esencial estar allí para recuperar DbProviderFactories de .NET completo. Por lo tanto, resucitará si se fusiona el PR de dotnet/corefx#19826.

Colaborador por primera vez, me gustaría probar System.Linq.Expressions.

¡Gran @mccbraxton! Si necesitas ayuda, mándame un ping.

@mccbraxton Parece que System.Linq.Expressions ya está limpio. ¿Quieres tomar otra pieza?

@ViktorHofer Tienes razón, debes haber leído mal. ¿Qué hay de System.Security.Cryptography.Algorithms?

¡Se ve bien! Te agregué en la tabla. Asegúrese de no eliminar el código que utiliza cualquier objetivo. ¡Gracias por tu ayuda!

dotnet/corefx#18162 se encargó de lo que quedaba en el informe de Microsoft.CSharp que estaba realmente muerto.

Hola nueva contribución aquí, puedo tomar System.ComponentModel.*

Gracias @norek, ve por ello.

Hola, debajo del resumen de System.ComponentModel.

  • raíz - Nada que eliminar
  • .Anotaciones: nada que eliminar
  • .EventBasedAsync: nada que eliminar
  • .Primitivas: marcadas como muertas pero no lo están
  • .TypeConverters: eliminé algo de código. Pero estoy confundido con el operador! = - está marcado como muerto pero no conozco todas sus convenciones de codificación - ¿debería eliminarse también?

Estaba revisando la lista y encontré un código muerto en System.Diagnostics: StackTraceSymbols está marcado como muerto, pero el nombre de esta clase en el explorador de soluciones es StackTraceSymbols.CoreCLR.cs . Encontré en ediciones cerradas: dotnet/corefx#19368
y esta muerto o no?

@mikem8361 ¿Tiene SDStackTraceSymbols?

Lo tengo y no es un código muerto. System.Private.CoreLib usa Reflection para cargar este ensamblado y hacer referencia a esta clase.

Por lo tanto, coreclr puede imprimir información de fuente/número de línea en seguimientos de pilas de excepciones no controladas.

@ mikem8361 gracias por la información. Parece que está protegido por 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 ¿podemos arreglar el CSV que emite ILLink para que no muestre el código como inactivo cuando lo obligamos a retener el código?

Los CSV que tenemos son simplemente la diferencia después del recorte, por lo que no tienen cosas explícitamente enraizadas. Los datos vinculados en este número no están activos. Es de una ejecución única cuando abrí el problema. Sospecho que si miraras la información en vivo, ya no se mostraría como una diferencia.

Hola, soy un colaborador por primera vez. Me gustaría probar System.Net.Http y System.Net.HttpListener.

@soapdogg , adelante...

@AlexGhiondea como se mencionó

Hola. ¿Puedo tomar Microsoft.VisulaBasic ?

@satano seguro, adelante. Parece que solo hay unos pocos bits para eliminar (todos los campos constantes y el factor sin parámetros no deben permanecer, según mi descripción anterior). ¿Tal vez podrías hacer CSharp también?

También hay algunas bibliotecas que son nuevas desde que se realizó el análisis anterior...

OK, haré CSharp y VisualBasic.

PR por Microsoft.VisualBasic está listo.

Con respecto a Microsoft.CSharp , todo lo que está en rojo en el archivo diff ya se eliminó. Así que simplemente márcalo en el problema.

¿Vamos a dejar este tema para los novatos o puedo continuar?

@satano , ¿puede encontrar el cambio que eliminó la diferencia roja?
Está bien continuar, no lo guardamos solo para los novatos.

Continuaré desde arriba. Entonces, a continuación, tomaré System.IO.Compression , System.IO.FileSystem.AccessControl y System.IO.FileSystem .

@satano , adelante, no es necesario pedir permiso, si alguien más estuviera mirando, publicaría aquí.

Un "metaproblema" interesante para alguien es si hay una manera de usar la misma herramienta de vinculación para encontrar código común que nadie está usando. Si una biblioteca solo usa parcialmente una clase extraída de srccommon, aparecerá inactiva en este análisis, pero no se puede eliminar porque otra biblioteca podría estar extrayéndola y usándola. Lo que estaba pensando es si hay una forma de fusionar los ensamblajes y luego ejecutar el enlazador en ellos. @erozenfeld , ¿podríamos usar el enlazador para fusionar y luego encontrar código muerto en el resultado?

Actualmente, ILLink no puede fusionar ensamblajes. Esto es algo que estamos considerando agregar en el futuro. Hay otras herramientas que pueden hacer eso: https://github.com/Microsoft/ILMerge y https://github.com/gluck/il-repack aunque no estoy seguro si manejan este escenario de la manera que queremos. Pueden o no darse cuenta de que los tipos/métodos/campos con nombres en conflicto representan entidades idénticas.

Sigo con System.Net.Http , System.Net.HttpListener y System.Net.NetworkInformation .

Tomaré System.Net.* enteros uno por uno.

Continuando con el resto: System.Private.* , System.Runtime.* y System.Security.* .

@karelz

… ¿puedes encontrar el cambio que eliminó la diferencia roja?

dotnet/corefx#18162

Bueno... ¿Probablemente es hora de revisar este problema y tal vez cerrarlo?

El código inactivo de estos proyectos se eliminó y fusionó:

  • Microsoft.CSharp (ya hecho anteriormente como se menciona en el comentario anterior)
  • Microsoft.VisualBasic
  • Sistema.IO.Compresión
  • Sistema.IO.Sistema de archivos
  • Sistema.IO.FileSystem.AccessControl
  • Sistema.Neto.Http
  • Sistema.Net.HttpListener
  • System.Net.NetworkInformation
  • System.Net.Primitives
  • System.Net.Solicitudes
  • Sistema.Red.Seguridad
  • Sistema.Net.Sockets
  • Sistema.Net.WebClient
  • Sistema.Net.WebSocket.Cliente
  • System.Private.DataContractSerialization
  • Sistema.Privado.Uri
  • Sistema.Seguridad.Criptografía.Cng
  • Sistema.Seguridad.Criptografía.Csp

Miré también el resto de proyectos y no hay nada que hacer en ellos:

  • System.Net.WebHeaderCollection
  • Sistema.Net.WebSockets
  • Sistema.Tiempo de ejecución
  • System.Runtime.Serialization.Primitives
  • Sistema.Seguridad.Control de Acceso
  • Reclamaciones.de.seguridad.del.sistema
  • Sistema.Seguridad.Criptografía.Algoritmos
  • Sistema.Seguridad.Criptografía.Codificación
  • Sistema.Seguridad.Criptografía.OpenSsl

Entonces, el único proyecto que queda es Microsoft.XmlSerializer.Generator . Tiene la mayor parte del código muerto, pero como se menciona en algunos comentarios aquí, hay un trabajo en progreso allí, según lo entendí.

¿Este problema está completo? Si no, ¿podría tomar System.Console ?

@Iroca88 seguro. Tenga en cuenta que los volcados vinculados anteriormente pueden estar un poco desactualizados ahora.

Gracias @danmosemsft , ¿alguna sugerencia para obtener nuevos vertederos? De lo contrario, comenzaré con los volcados proporcionados anteriormente.

Por cierto: es @lroca88 , puse en mayúscula la primera letra (L) para evitar este tipo de confusión :)

@ Lroca88 la publicación superior explica cómo acceder a los ensamblajes recortados y precortados. Para diferenciarlos usamos una herramienta que no parece ser pública. Puede usar un descompilador como Ilspy en ambos y hacer una diferencia de texto en los resultados. Eso probablemente funcionaría.

Ejecutaré un diff reciente y lo compartiré. Manténganse al tanto.

Aquí está lo último:

  • [ ] [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 )
  • [ ] [Sistema.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 )
  • [ ] [Memoria del sistema](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 )
  • [ ] [Sistema.Privado.Xml](http://tempcoverage.blob.core.windows.net/report3/System.Private.Xml.diff.html) ( csv )
  • [ ] [Sistema.Privado.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 )
  • [ ] [Sistema.Seguridad.Cryptografía.Cng](http://tempcoverage.blob.core.windows.net/report3/System.Security.Cryptography.Cng.diff.html) ( csv )
  • [ ] [Sistema.Seguridad.Cryptografía.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 )

¡Genial, estaba luchando con la lista anterior! 🔨

@ Lroca88 asegúrese de leer las sugerencias de la publicación superior sobre cómo hacer este pase, ahorre un poco de confusión ...

UPS. Me perdí dos bits recién huérfanos en Microsoft.CSharp en dotnet/corefx#26491. Lo conseguiré pronto.

De la nueva lista, System.Runtime, System.Web.HttpUtility, System.Linq y System.Linq.Queryable solo tienen constantes que no están realmente muertas y algo de código compartido. System.Linq.Expressions tiene esos y algunos elementos que se usan en vistas de depuración y recursos que se usan con constantes de compilador particulares y, por lo tanto, deben eliminarse, para que esos cinco se puedan marcar.

Fusioné las bibliotecas revisadas por @JonHanna y las que revisé en una lista. Seguiré actualizando la lista a medida que mi tiempo lo permita, si alguien quiere agregar elementos a esta lista, ¡no dude en enviarme un ping!

Biblioteca | Revisado por | Estado
-- | -- | --
Microsoft.CSharp (csv) | @JonHanna | dotnet/corefx#27104
Microsoft.VisualBasic (csv) | @Lroca88 | nada que quitar
Microsoft.Win32.Primitivas (csv) | @Lroca88 | nada que quitar
Microsoft.Win32.Registro (csv) | @Lroca88 | nada que quitar
Sistema.Colecciones.Concurrente (csv) | @Lroca88 | nada que quitar
Sistema.Colecciones (csv) | @Lroca88 | nada que quitar
Sistema.Tiempo de ejecución (csv) | @JonHanna | nada que quitar
Sistema.Web.HttpUtility (csv) | @JonHanna | nada que quitar
Sistema. Linq (csv) | @JonHanna | nada que quitar
Sistema.Linq.Queryable (csv) | @JonHanna | nada que quitar

¡Gracias @Lroca88 !

No me sorprende que no quede mucho código muerto. Sin embargo, como se indica en la parte superior, este proceso no puede determinar si el código en srccommon está inactivo (ya que puede aparecer inactivo en un ensamblado pero no en otro). Si está interesado en encontrar una manera de resolverlo, probablemente encontrará más código muerto. Por ejemplo, tal vez sea posible ILMerge los ensamblajes y luego ejecutar el análisis de código muerto en ellos. O bien, puede ser más fácil postprocesar los CSV para encontrar un código común que esté inactivo en todos ellos. @ericstj ¿tienes ideas?

Es un placer ayudar a @danmosemsft ,
Estoy de acuerdo con usted, acerca de mejorar este proceso, según mis revisiones, el código más marcado no está muerto, es constante o se usa con frecuencia en otro ensamblaje como dijo anteriormente. En mi opinión, mirar esos falsos positivos hace que la búsqueda sea un poco tediosa.

Desafortunadamente, no sé cómo realizar el ILMerge y el análisis de código muerto o postprocesar los CSV. Sin embargo, estoy dispuesto a aprender/colaborar, si ustedes quieren pasar un tiempo enseñándome :)

¿Dónde estamos con esto? ¿Se mantiene actualizado el OP con las clases realizadas o deberíamos dejar este comentario ahora?

@MisinformedDNA : use https://github.com/dotnet/corefx/issues/17905#issuecomment -365349091, por favor

No sé cómo realizar el ILMerge y el análisis de código muerto o postprocesar los CSV. Sin embargo, estoy dispuesto a aprender/colaborar, si ustedes quieren pasar un tiempo enseñándome :)

Yo tampoco lo sé y tendría que pensar/experimentar. En este momento estoy completamente comprometido con el cierre de la versión 2.1, así que esto tendrá que esperar un poco 😺

Escribí una secuencia de comandos para cargar todos los CSV y luego filtré solo los más procesables. Se me ocurrieron 3942 problemas/oportunidades.

Ahora tengo la intención de echar un vistazo a cada uno de los problemas y tomar las medidas apropiadas. Puede seguir mi progreso y dejar comentarios, si lo desea, en https://github.com/MisinformedDNA/corefx/tree/clean-dead-code

Genial, deseando ver esto @MisinformedDNA.

Encontré un problema con el análisis de código muerto, que muestra un problema o una deficiencia con la herramienta.

El informe dice que se puede eliminar lo siguiente:

    Friend Enum vbErrors
        ObjNotSet = 91
        IllegalFor = 92
    End Enum

Pero estos Enums se mencionan en otros lugares, así que veamos una posible rama:

    ' 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 lógica me ha llevado al lugar donde la primera declaración "si" nunca es cierta. Pero esa declaración "Si" es una verificación null , por lo que tendríamos que suponer que alguien pasaría null y que falta un caso para determinar el código muerto. Y si hay un problema (o más) con la determinación del código inactivo, entonces uno o más de los Enums pueden no ser un código inactivo después de todo.

tldr: resumen

Pregunta 1: ¿Por qué VbMakeIllegalForException no está marcada para eliminación, aunque posiblemente no podría llamar a la enumeración que estaba marcada para eliminación?
Pregunta 2: ¿Por qué los casos de prueba para determinar el código muerto no pasan valores nulos para todos los parámetros aplicables?

@ericstj

Los valores de enumeración probablemente se insertaron en msil, por lo que la herramienta no los ve. Lo mismo es cierto para las constantes. No se debe hacer nada por el código fuente en estos casos.

Acabo de terminar de eliminar el código inactivo de System.Data.Common y build.cmd src\System.Data.Common se completó correctamente. Ahora, hasta ahora, tenía la impresión de que solo necesitaba trabajar en la biblioteca en la que estaba y si la compilación y las pruebas pasaban, entonces estaba listo para comenzar. Pero decidí hacer una compilación completa de todos modos, y me alegro de haberlo hecho, porque tuve una gran cantidad de errores.

Aquí hay algunos errores de ejemplo:

SystemDataSqlClientSqlCommandBuilder.cs(277,17): error CS0117: 'ADP' no contiene una definición para 'RemoveStringQuotes' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataProviderBaseDbConnectionPool.cs(984,33): error CS0117: 'ADP' no contiene una definición para 'SetCurrentTransaction' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
D:ReposcorefxsrcCommonsrcSystemDataProviderBaseDbMetaDataFactory.cs(409,21): error CS0117: 'ADP' no contiene una definición para 'IsEmptyArray' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataCommonDbConnectionStringCommon.cs(180,27): error CS0117: 'ADP' no contiene una definición para 'InvalidConnectionOptionValue' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]

Los miembros que faltan se especificaron claramente para ser eliminados en System.Data.Common.diff.html , pero no solo causan errores en las clases secundarias, sino que no hay archivos diff para estas clases secundarias o ensamblajes asociados como System.Data.SqlClient .

El primer error que se muestra arriba está vinculado a un método público, SqlCommandBuilder.UnquoteIdentifier . Por lo tanto, no veo cómo ADP.RemoveStringQuotes se puede eliminar de System.Data.Common sin un cambio importante en otras clases.

¿Cómo debo manejar estos? ¿Alguna idea de por qué están marcados para su eliminación?

@anipik ¿puedes ayudar a @misinformeddna aquí?

@MisinformedDNA Siempre tendrá que compilar todo el repositorio y ejecutar las pruebas para todas las bibliotecas porque es posible que una biblioteca dependa de otra biblioteca directamente (A usando algún tipo de B) o indirectamente. (A usando algún tipo de B que usando algún tipo de C)
No hay nada en la función ADP.removeStringQuotes , isemptyarray , setTransaction que sea solo específico de ApaterUtil o System.Data.Common, por lo que podemos moverlo a sqlCommandBuilder.cs como un método estático privado. Solo están manipulando los argumentos. Si pudiera indicarme la sucursal que tiene este error, puedo ayudarlo con otros errores.

Todos los métodos que mencionó anteriormente son internal static methods que ya no se utilizan en el ensamblaje en el que están definidos.
Por lo general, los miembros internos no están destinados a usarse fuera del ensamblaje en el que están definidos. pero en algunos casos lo hacemos usando el atributo ``Internals Visible To```.

@danmosemsft está trasladando estas funciones internas a los ensamblajes donde se utilizan de manera óptima.

Aquí está la bifurcación en la que estoy trabajando: https://github.com/MisinformedDNA/corefx/tree/clean-dead-code

Como se indicó anteriormente, el análisis de código muerto dice que se podría eliminar ADP.RemoveStringQuotes por System.Data.Common . Sin embargo, dado que ADP se marcó internal , es posible que el analizador haya asumido que no se estaba usando fuera del ensamblaje. No estoy seguro de si busca el atributo InternalsVisibleTo , pero no habría importado si lo hiciera, porque no se usa aquí. En cambio, se comparte a través de archivos vinculados.

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

Supongo que el analizador está viendo las diferentes clases ADP como tipos separados, en lugar de compartidos, ya que esencialmente se están duplicando. Entonces, si bien eliminar RemoveStringQuotes es lo correcto para System.Data.Common , es lo incorrecto cuando se consideran otros proyectos a los que está vinculado.

A menos que el analizador pueda determinar que todas esas clases provienen del mismo archivo, siempre pensaremos que tenemos código muerto en algunos de estos archivos.

A menos que alguien tenga una sugerencia mejor, comenzaré a agregar estos métodos nuevamente al código.

@MisinformedDNA hablé de esto con @danmosemsft sin conexión. Otro enfoque posible es hacer que la clase ADP sea parcial. Y luego puede mover estas funciones a estas bibliotecas.

Presenté mi primer PR, pero 2 de las compilaciones fallaron. Ambas fallas de compilación parecen indicar un tiempo de espera. ¿Qué acción debo tomar para resolver esto?

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

Miraré el System.Private.Uri

Aquí hay una (s) aplicación (es) que escribí para descargar todos los archivos, combinarlos y luego filtrar todos aquellos que probablemente sean falsos positivos. Con suerte, será útil para otros.

@ericstj , ¿tiene sentido regenerar los datos para que tengamos una idea más clara de dónde estamos con esto?

Comenzó en los siguientes espacios de nombres:

  • Sistema.Colecciones.Especializadas

    • Solo 2 propiedades de CompatibleComparer, pero archivo en src/common y más amplio en uso.

  • System.Diagnostics.DiagnosticSource
  • System.Diagnostics.FileVersionInfo
  • Sistema.Diagnóstico.Proceso
  • Sistema.Diagnósticos.StackTrace
  • Sistema.Diagnósticos.TextWriterTraceListener
  • Herramientas.de.diagnóstico.del.sistema
  • Sistema.Diagnósticos.TraceSource
  • Sistema.Diagnóstico.Rastreo

He regenerado los datos. Aquí está como una nueva lista, no quería sobrescribir lo que había allí en caso de que la gente lo encuentre relevante.

  • [ ] [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] [Sistema.IO.Compresión.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] [Sistema.IO.Pipes](http://tempcoverage.blob.core.windows.net/report4/System.IO.Pipes.diff.html) ( csv )
  • [ ] [Sistema.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 )
  • [ ] [Memoria del sistema](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 )
  • [ ] [Sistema.Privado.Xml](http://tempcoverage.blob.core.windows.net/report4/System.Private.Xml.diff.html) ( csv )
  • [ ] [Sistema.Privado.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 )
  • [ ] [Sistema.Seguridad.Cryptografía.Cng](http://tempcoverage.blob.core.windows.net/report4/System.Security.Cryptography.Cng.diff.html) ( csv )
  • [ ] [Sistema.Seguridad.Cryptografía.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 )

¡Gracias Eric!

Comprobado lo siguiente:

  • Sistema.IO.Compresión.Brotli
  • Sistema.IO.Compression.ZipFile
  • System.IO.FileSystem.DriveInfo
  • System.IO.Almacenamiento aislado
  • System.IO.MemoryMappedFiles
  • Sistema.IO.Tubos
  • Memoria del sistema

Limpiando código muerto para:
System.Diagnostics.DiagnosticSource
System.Diagnostics.FileVersionInfo
Sistema.Diagnóstico.Proceso
Sistema.Diagnósticos.StackTrace
Sistema.Diagnósticos.TextWriterTraceListener
Herramientas.de.diagnóstico.del.sistema
Sistema.Diagnósticos.TraceSource
Sistema.Diagnóstico.Rastreo
Sistema.Dibujo.Primitivas

dotnet/corefx#33095

Me gustaría encargarme de la limpieza de System.IO.Compression como mi primera contribución.

En la publicación de inicio System.Console marcado como hecho, pero en los datos regenerados no está marcado. Descubrí que solo se necesitan algunas cadenas SR para borrar.
Entonces, @ericstj , ¿es un error o puedo echar un vistazo a otras bibliotecas y corregir códigos muertos tan pequeños?

Resumen

Creé una pequeña herramienta que eliminó algunas cosas inútiles de estos datos .


Elimina:

  1. Todas las constantes que están marcadas en rojo.

Este es uno muy común. Cualquier cosa con "const", por favor ignorar. Estos son todos los campos alineados por el compilador, queremos mantenerlos en las fuentes. Típicamente enteros y cadenas.

  1. Todas las cosas que no están marcadas en rojo (ese código no está muerto).

Permanece:

  1. Cualquier clase o estructura de nivel de anidamiento que contenga código muerto. Ayuda a encontrar ese código más rápido.
  2. Todas las cadenas SR que se pueden eliminar. Pero los métodos SR tampoco se eliminan, tenga en cuenta.

Cualquier cosa que sea "cadena estática" en "clase SR" es especial. En lugar de editar un archivo C#, debe encontrar la entrada correspondiente en el archivo .resx y eliminarla. El archivo .resx para una biblioteca está en srcsrcResourcesstrings.resx. La compilación regenerará SR después de hacer esto. Ignore cualquier otra cosa en la "clase SR": hay varios métodos que pueden aparecer como inactivos.

  1. Clases con un solo constructor sin parámetros. Ayuda a evitar hacer cualquier cosa con ellos.

Ignore cualquier constructor privado sin parámetros. Los tenemos en el código para evitar instanciar accidentalmente la clase, queremos mantenerlos en el código.

Ignore los constructores públicos sin parámetros si no hay otros constructores. Estos no son reales.


También:

Puede encontrar archivos borrados aquí . Mencióname después de actualizar los datos y los actualizaré.

@ericstj ¿es seguro eliminar internal enum ?

Después de usar esa herramienta , verifiqué todos los ensamblajes. Algunos de ellos no tienen ningún código muerto.
La lista actualizada se parece a la siguiente. Cambio los enlaces a htmlpreview para archivos borrados del repositorio de la herramienta . Espero que a nadie le importe.

Entonces, @ericstj , ¿es un error o puedo echar un vistazo a otras bibliotecas y corregir códigos muertos tan pequeños?

Al regenerar las diferencias comencé con todo despejado nuevamente. El mecanismo para hacer las diferencias de código muerto es demasiado manual. Está usando una herramienta interna para los diferenciales de ensamblaje.

@ericstj ¿es seguro eliminar la enumeración interna?

Depende de lo que se haga con esa enumeración interna. Las enumeraciones a menudo aparecerán como muertas en el binario ya que el compilador convierte su referencia de origen en literales enteros. Es probable que descubras que la fuente aún puede necesitarlo.

Solo algunas ideas sobre cómo podemos hacer que este código inactivo depure una mejor experiencia que sea más estable y avance.

  1. Agregue una herramienta de diferenciación a la apertura. He estado usando AsmDiff que es interno. Podríamos abrir eso o crear algo nuevo sobre las bibliotecas existentes (SRM, CCI o Cecil).
  2. Permita que los proyectos opten por esta validación sin código muerto y elimine las cosas que las herramientas pasan por alto.
  3. Iterar en 2 poniendo heurísticas en reglas de filtrado y/o diferencias.
  4. Una vez que tengamos suficiente funcionalidad en las herramientas, habilítela para todo el repositorio, confirme las líneas de base donde permitimos el código muerto y nunca más tengamos que volver a este problema 😄

Hoy en día, el mecanismo que usamos para el código muerto de sacudida de árboles es el enlazador que opera en los binarios. Entonces, para mapear eso de regreso a la fuente, diferenciamos su salida con la entrada y emitimos las identificaciones. Otra cosa que he discutido con la gente del enlazador en el pasado es emitir más registros que podrían mapear más directamente a las cosas que les importan a nuestros desarrolladores. También funciona con PDB, por lo que técnicamente tiene todo el código fuente y la información de línea.

@ericstj , ¿es técnicamente posible ejecutarlo en corelib? Noté un método muerto en corelib, y sin duda hay más. Ciertamente necesitaría atención dadas todas las devoluciones de llamada de la VM

@danmosemsft Ya se está ejecutando en System.Private.Corelib.dll como parte de la compilación coreclr. ¿Cuál es el método muerto que notó que no se elimina?

@ericstj ¿Supongo que podemos cerrar esto?

Creo que esto está hecho por ahora. ¡Muchas gracias a todos los que contribuyeron a mejorar nuestro código base!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

omajid picture omajid  ·  3Comentarios

yahorsi picture yahorsi  ·  3Comentarios

Timovzl picture Timovzl  ·  3Comentarios

jchannon picture jchannon  ·  3Comentarios

bencz picture bencz  ·  3Comentarios