Runtime: Bersihkan kode mati

Dibuat pada 5 Apr 2017  ·  152Komentar  ·  Sumber: dotnet/runtime

Setelah mengaktifkan mono linker untuk binari .NETCoreApp kami, ia telah mengidentifikasi sejumlah tempat di mana kami memiliki kode mati.

Ini termasuk dalam 3 kategori.

  1. Kode yang benar-benar mati yang tidak digunakan di mana pun di Majelis.

    • Ini bisa dihapus

  2. File sumber yang digunakan dalam satu rakitan, tetapi tidak semua. File sumber umum di mana beberapa proyek menggunakan sumbernya, tetapi tidak semua.

    • Ini dapat menjadi faktor yang lebih baik, dipisah untuk menyediakan sumber minimal jika diperlukan. Atau, mereka mungkin berisi kode yang benar-benar mati.

  3. Waktu kompilasi hanya sumber. Konstanta internal yang direpresentasikan sebagai literal dalam memanggil IL dan tidak diekspos secara publik.

    • Ini harus tetap ada.

perbedaan

  • [ ] [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 oleh @YoupHulsebos
  • [x] [System.Collections.Immutable](http://tempcoverage.blob.core.windows.net/report2/System.Collections.Immutable.diff.html) ( csv ) - Tidak ada yang perlu dihapus oleh @YoupHulsebos di 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 ) - Tidak ada yang dihapus oleh @YoupHulsebos di 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 ) - Diperbaiki di dotnet/corefx#19141 oleh @ YoupHulsebos
  • [x] [System.Diagnostics.Debug](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.Debug.diff.html) ( csv )
  • [x] [System.Diagnostics.DiagnosticSource](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.DiagnosticSource.diff.html) ( csv )
  • [x] [System.Diagnostics.FileVersionInfo](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.FileVersionInfo.diff.html) ( csv )
  • [x] [System.Diagnostics.Process](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.Process.diff.html) ( csv )
  • [x] [System.Diagnostics.StackTrace](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.StackTrace.diff.html) ( csv )
  • [x] [System.Diagnostics.TextWriterTraceListener](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.TextWriterTraceListener.diff.html) ( csv )
  • [x] [System.Diagnostics.Tools](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.Tools.diff.html) ( csv )
  • [x] [System.Diagnostics.TraceSource](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.TraceSource.diff.html) ( csv )
  • [x] [System.Diagnostics.Tracing](http://tempcoverage.blob.core.windows.net/report2/System.Diagnostics.Tracing.diff.html) ( csv )
  • [x] [System.Drawing.Primitives](http://tempcoverage.blob.core.windows.net/report2/System.Drawing.Primitives.diff.html) ( csv )
  • [ ] [System.IO.Compression](http://tempcoverage.blob.core.windows.net/report2/System.IO.Compression.diff.html) ( csv )
  • [x] [System.IO.Compression.ZipFile](http://tempcoverage.blob.core.windows.net/report2/System.IO.Compression.ZipFile.diff.html) ( csv )
  • [ ] [System.IO.FileSystem.AccessControl](http://tempcoverage.blob.core.windows.net/report2/System.IO.FileSystem.AccessControl.diff.html) ( csv )
  • [ ] [System.IO.FileSystem](http://tempcoverage.blob.core.windows.net/report2/System.IO.FileSystem.diff.html) ( csv )
  • [x] [System.IO.FileSystem.DriveInfo](http://tempcoverage.blob.core.windows.net/report2/System.IO.FileSystem.DriveInfo.diff.html) ( csv )
  • [x] [System.IO.FileSystem.Watcher](http://tempcoverage.blob.core.windows.net/report2/System.IO.FileSystem.Watcher.diff.html) ( csv )
  • [x] [System.IO.IsolatedStorage](http://tempcoverage.blob.core.windows.net/report2/System.IO.IsolatedStorage.diff.html) ( csv )
  • [x] [System.IO.MemoryMappedFiles](http://tempcoverage.blob.core.windows.net/report2/System.IO.MemoryMappedFiles.diff.html) ( csv )
  • [x] [System.IO.Pipes](http://tempcoverage.blob.core.windows.net/report2/System.IO.Pipes.diff.html) ( csv )
  • [x] [System.Linq](http://tempcoverage.blob.core.windows.net/report2/System.Linq.diff.html) ( csv ) - Tidak ada yang dihapus, https://github.com/dotnet /corefx/issues/17905#issuecomment-294286344 oleh @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 ) - Diperbaiki di dotnet/corefx#19143 oleh @ YoupHulsebos
  • [x] [System.Linq.Queryable](http://tempcoverage.blob.core.windows.net/report2/System.Linq.Queryable.diff.html) ( csv ) - Tidak ada yang dihapus - https://github .com/dotnet/corefx/issues/17905#issuecomment-294286344 oleh @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 ) - Diperbaiki di dotnet/corefx#19532 oleh @ Ermiar
  • [x] [System.Net.NameResolution](http://tempcoverage.blob.core.windows.net/report2/System.Net.NameResolution.diff.html) ( csv )
  • [ ] [System.Net.NetworkInformation](http://tempcoverage.blob.core.windows.net/report2/System.Net.NetworkInformation.diff.html) ( csv )
  • [x] [System.Net.Ping](http://tempcoverage.blob.core.windows.net/report2/System.Net.Ping.diff.html) ( csv )
  • [ ] [System.Net.Primitives](http://tempcoverage.blob.core.windows.net/report2/System.Net.Primitives.diff.html) ( csv )
  • [ ] [System.Net.Requests](http://tempcoverage.blob.core.windows.net/report2/System.Net.Requests.diff.html) ( csv )
  • [ ] [System.Net.Security](http://tempcoverage.blob.core.windows.net/report2/System.Net.Security.diff.html) ( csv )
  • [x] [System.Net.ServicePoint](http://tempcoverage.blob.core.windows.net/report2/System.Net.ServicePoint.diff.html) ( csv )
  • [ ] [System.Net.Sockets](http://tempcoverage.blob.core.windows.net/report2/System.Net.Sockets.diff.html) ( csv )
  • [ ] [System.Net.WebClient](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebClient.diff.html) ( csv )
  • [ ] [System.Net.WebHeaderCollection](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebHeaderCollection.diff.html) ( csv )
  • [x] [System.Net.WebProxy](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebProxy.diff.html) ( csv )
  • [ ] [System.Net.WebSockets.Client](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebSockets.Client.diff.html) ( csv )
  • [ ] [System.Net.WebSockets](http://tempcoverage.blob.core.windows.net/report2/System.Net.WebSockets.diff.html) ( csv )
  • [x] [System.Numerics.Vectors](http://tempcoverage.blob.core.windows.net/report2/System.Numerics.Vectors.diff.html) ( csv )
  • [x] [System.ObjectModel](http://tempcoverage.blob.core.windows.net/report2/System.ObjectModel.diff.html) ( csv )
  • [ ] [System.Private.DataContractSerialization](http://tempcoverage.blob.core.windows.net/report2/System.Private.DataContractSerialization.diff.html) ( csv )
  • [ ] [System.Private.Uri](http://tempcoverage.blob.core.windows.net/report2/System.Private.Uri.diff.html) ( csv )
  • [x] [System.Private.Xml](http://tempcoverage.blob.core.windows.net/report2/System.Private.Xml.diff.html) ( csv )
  • [x] [System.Private.Xml.Linq](http://tempcoverage.blob.core.windows.net/report2/System.Private.Xml.Linq.diff.html) ( csv )
  • [x] [System.Reflection.DispatchProxy](http://tempcoverage.blob.core.windows.net/report2/System.Reflection.DispatchProxy.diff.html) ( csv )
  • [x] [System.Reflection.Metadata](http://tempcoverage.blob.core.windows.net/report2/System.Reflection.Metadata.diff.html) ( csv )
  • [x] [System.Reflection.TypeExtensions](http://tempcoverage.blob.core.windows.net/report2/System.Reflection.TypeExtensions.diff.html) ( csv )
  • [x] [System.Resources.Writer](http://tempcoverage.blob.core.windows.net/report2/System.Resources.Writer.diff.html) ( csv )
  • [x] [System.Runtime.CompilerServices.VisualC](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.CompilerServices.VisualC.diff.html) ( csv )
  • [ ] [System.Runtime](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.diff.html) ( csv )
  • [x] [System.Runtime.Extensions](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.Extensions.diff.html) ( csv )
  • [x] [System.Runtime.InteropServices](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.InteropServices.diff.html) ( csv )
  • [x] [System.Runtime.InteropServices.RuntimeInformation](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.InteropServices.RuntimeInformation.diff.html) ( csv )
  • [x] [System.Runtime.Numerics](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.Numerics.diff.html) ( csv )
  • [x] [System.Runtime.Serialization.Formatters](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.Serialization.Formatters.diff.html) ( csv ) - Diperbaiki di dotnet/corefx #19148 oleh @yaelkeemink
  • [ ] [System.Runtime.Serialization.Primitives](http://tempcoverage.blob.core.windows.net/report2/System.Runtime.Serialization.Primitives.diff.html) ( csv )
  • [ ] [System.Security.AccessControl](http://tempcoverage.blob.core.windows.net/report2/System.Security.AccessControl.diff.html) ( csv )
  • [ ] [System.Security.Claims](http://tempcoverage.blob.core.windows.net/report2/System.Security.Claims.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Algorithms](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Algorithms.diff.html) ( csv ) @mccbraxton
  • [ ] [System.Security.Cryptography.Cng](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Cng.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Csp](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Csp.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.Encoding](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Encoding.diff.html) ( csv )
  • [ ] [System.Security.Cryptography.OpenSsl](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.OpenSsl.diff.html) ( csv )
  • [x] [System.Security.Cryptography.Primitives](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.Primitives.diff.html) ( csv )
  • [x] [System.Security.Cryptography.X509Certificates](http://tempcoverage.blob.core.windows.net/report2/System.Security.Cryptography.X509Certificates.diff.html) ( csv ) - Diperbaiki di dotnet/corefx #19144 oleh @yaelkeemink
  • [x] [System.Security.Principal](http://tempcoverage.blob.core.windows.net/report2/System.Security.Principal.diff.html) ( csv ) - Tidak ada yang dihapus
  • [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 ) - Tidak ada yang dihapus
  • [x] [System.Threading.Tasks.Parallel](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Tasks.Parallel.diff.html) ( csv ) - Tidak ada yang dihapus
  • [x] [System.Threading.Thread](http://tempcoverage.blob.core.windows.net/report2/System.Threading.Thread.diff.html) ( csv ) - Tidak ada yang dihapus
  • [x] [System.Transactions.Local](http://tempcoverage.blob.core.windows.net/report2/System.Transactions.Local.diff.html) ( csv )
  • [x] [System.Web.HttpUtility](http://tempcoverage.blob.core.windows.net/report2/System.Web.HttpUtility.diff.html) ( csv ) - Tidak ada yang perlu dihapus
  • [x] [System.Xml.XPath.XDocument](http://tempcoverage.blob.core.windows.net/report2/System.Xml.XPath.XDocument.diff.html) ( csv ) - Tidak ada yang dihapus

Latar Belakang

Laporan dibuat dengan mengaktifkan ILLink (pembuatan mono linker dari tim codegen /cc @erozenfeld) dan membedakan hasilnya.

Perbedaannya adalah dari build Windows dan dibatasi hanya untuk rakitan yang merupakan bagian dari NETCore.App.

Ketika tautan diaktifkan, itu akan menghasilkan folder "PreTrim" di folder objek Majelis, misalnya <corefx>\bin\obj\AnyOS.AnyCPU.Debug\Microsoft.CSharp\netstandard\PreTrim\Microsoft.CSharp.dll .

Untuk mengaktifkan salinan pusat dari rakitan yang dipangkas, Anda dapat mengatur properti BinPlaceILLinkTrimAssembly=true , Ini akan menyalin semua rakitan yang telah dipotong dan dipangkas ke folder di bawah bin: <corefx>\bin\ILLinkTrimAssembly\netcoreapp-Windows_NT-Debug-x64 .

Untuk menghasilkan laporan yang ditautkan dalam masalah ini, Anda harus memiliki salinan alat AsmDiff.exe. Alat ini belum tersedia untuk inti, lihat (https://github.com/dotnet/buildtools/issues/1420). Jika Anda memiliki alat versi desktop, Anda dapat mengaktifkan pelaporan dengan menyetel AsmDiffCmd=<pathToAsmDiff.exe>

Linker dapat diaktifkan untuk proyek apa pun (bukan hanya yang ada di NETCore.App) dengan membangun ILLinkTrimAssembly=true setelah https://github.com/dotnet/corefx/pull/17825 digabungkan.

cara mengatasi perpustakaan

Pilih perpustakaan dan buat catatan bahwa Anda akan mengerjakannya.

Buka laporan html di atas untuk perpustakaan. Cari garis berwarna merah. Ini secara teoritis mati. Cari kode di folder src dari repo ini dan hapus. Lanjutkan melalui laporan untuk perpustakaan dan hapus semua kode mati seperti itu.

TAPI ada beberapa kasus khusus:

  1. Ini adalah hal yang sangat umum. Apa pun dengan "const", harap abaikan. Ini semua adalah bidang yang digariskan oleh kompiler, kami ingin menyimpannya di sources. Biasanya int dan string.
  2. Apa pun yang merupakan "string statis" di "kelas SR" adalah istimewa. Alih-alih mengedit file C#, Anda harus menemukan entri yang cocok di file .resx dan menghapusnya. File .resx untuk perpustakaan ada di src\<library>\src\Resources\strings.resx . Build akan meregenerasi SR setelah Anda melakukan ini. Abaikan hal lain di "kelas SR" -- ada beberapa metode yang mungkin terlihat mati.
  3. Abaikan konstruktor tanpa parameter pribadi apa pun. Kami memiliki ini dalam kode untuk mencegah membuat instance kelas secara tidak sengaja, kami ingin menyimpannya dalam kode.
  4. Abaikan konstruktor tanpa parameter publik jika tidak ada konstruktor lain. Ini tidak nyata.
  5. Beberapa kode tidak akan berada di bawah folder perpustakaan, itu akan berada di src\common. Kode ini mungkin tidak benar-benar mati karena perpustakaan lain mungkin menggunakannya. Idealnya, grep untuk melihat apakah orang lain di pohon menggunakannya -- jika demikian, itu bisa dihapus. Atau, abaikan saja dan kita bisa melakukan pass lain nanti.
  6. Jika kode tersebut hanya digunakan di Unix, UAP, dll jangan dihapus. Kemungkinan besar tidak mati. Anda dapat mengetahui apakah itu jenis ini dengan dikelilingi oleh misalnya #if uap atau memiliki kondisi dalam file .csproj seperti misalnya '$(TargetGroup)' == 'uap'"

Setelah Anda menghapus kode mati dari perpustakaan, pastikan itu dibangun (jalankan "msbuild" di folder "src" untuk perpustakaan). Jika tidak, mundur. Jika memang membangun, selanjutnya periksa tes build and pass (jalankan "msbuild /t:buildandtest" di folder "tests"). Sekali lagi jika tidak, telusuri kembali langkah Anda.

Jika semuanya terlihat bagus, Anda bisa membuat PR untuk perpustakaan. Ketika PR masuk, kita bisa memeriksanya di sini.

area-Meta easy enhancement untriaged up-for-grabs

Semua 152 komentar

Berikut adalah tabel yang mencantumkan perbedaan dalam byte, dalam urutan menurun. XML sudah memiliki masalah

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

Ini adalah masalah yang sangat mudah untuk diambil oleh kontributor baru. Buka saja salah satu file htm, dan hapus sumber yang ditandai dengan warna merah.

Hal yang jelas terlihat adalah bahwa kelas SR yang dihasilkan hampir selalu memiliki beberapa anggota yang tidak digunakan, dan itu muncul di semua (atau setidaknya sebagian besar) dari majelis kami. Itu bisa memberi kami beberapa peningkatan global yang mudah jika kami menemukan cara untuk memperbaikinya.

Saya juga melihat bahwa bidang private const muncul dalam beberapa kasus. Mereka digunakan oleh implementasi kelas itu, tetapi jelas tidak terlihat atau digunakan di luar. Mungkin tidak ada gunanya mencoba "memperbaiki" masalah itu.

Jika implementasi kelas yang menggunakan bidang private const dapat dicapai melalui titik masuk yang terlihat di luar Majelis, bidang tersebut tidak dihapus.

Agaknya jika ada perpustakaan yang memiliki internal-visible-to (misalnya untuk unit test) kita akan melihat positif palsu, bukan?

Jika perakitan memiliki InternalsVisibleTo, maka semua internal juga dianggap sebagai root.

OKE. Saya pikir ada beberapa kasus di mana tes menggunakan refleksi untuk mendapatkan internal. Tapi itu akan segera ditemukan saat kami menjalankan tes.

@mellinoe

Hal yang jelas terlihat adalah bahwa kelas SR yang dihasilkan hampir selalu memiliki beberapa anggota yang tidak digunakan, dan itu muncul di semua (atau setidaknya sebagian besar) dari majelis kami. Itu bisa memberi kami beberapa peningkatan global yang mudah jika kami menemukan cara untuk memperbaikinya.

Saya sudah membuat izin pada bulan Februari dengan menghapus 100-an string mati. Akan ada sangat sedikit yang tersisa. Saya pikir ini adalah kasus di mana metode yang mereferensikan string itu sendiri dipangkas. Dalam hal ini tentu saja resx perlu dipangkas.

@danmosemsft Saya mengacu pada blok anggota ini yang selalu dipancarkan dalam file yang dihasilkan:

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

Seringkali (setidaknya dari skimming singkat saya ), hanya yang pertama yang digunakan, dan terkadang yang kedua. Di beberapa yang saya klik, ini adalah bagian terbesar dari diff.

OKE. Saya pikir ada beberapa kasus di mana tes menggunakan refleksi untuk mendapatkan internal. Tapi itu akan segera ditemukan saat kami menjalankan tes.

Saya sudah membahas sebagian besar dari itu: https://github.com/dotnet/corefx/pull/17825/commits/2277db969616a5ad4fd9f4a8118a3b4030ff62d3

Kami sudah dalam dan loop luar bersih.

Laporan untuk Dataflow mengatakan bahwa tipe di ruang nama System.Threading.Tasks.Dataflow.Internal.Threading sudah mati. Itu tidak benar, mereka mati dalam konfigurasi default, tetapi ada konfigurasi lain yang menggunakannya. Lihat https://github.com/dotnet/corefx/pull/17912 untuk perubahan yang saya usulkan.

Apakah mungkin ada tipe lain seperti itu? Apakah ada sesuatu yang harus dilakukan tentang mereka?

Laporan ini hanya untuk NETCoreApp di Windows. Ada kemungkinan bahwa konfigurasi lain masih menggunakannya dan itu akan ditangkap oleh build -allConfigurations jika seseorang mencoba menghapusnya sepenuhnya. Untuk kasus seperti ini, Anda dapat meningkatkan konfigurasi NETCoreApp dengan if-def'ing/membagi sumber seperti yang saya sebutkan pada item 2 di atas. Ini terlihat seperti yang Anda lakukan di dotnet/corefx#17912

Jika Anda tertarik untuk mengidentifikasi perbedaan untuk konfigurasi lain di mana kami tidak menjalankan tautan, Anda dapat mengaktifkannya menggunakan detail yang saya cantumkan di bagian latar belakang. Ini akan lebih mudah setelah PR digabungkan sehingga Anda mungkin hanya ingin menunggu.

@erozenfeld Kami tidak ingin menghapus const apa pun hanya karena mereka digariskan oleh kompiler, karena itu kehilangan kejelasan kode. Tetapi beberapa const benar-benar mati, dan yang mungkin ingin kami hapus.

Misalnya di http://tempcoverage.blob.core.windows.net/report2/System.ComponentModel.TypeConverter.diff.html seluruh VSStandardCommands ditandai mati. Beberapa terlihat (melalui public class StandardCommands ), dan hanya sebaris. Tetapi beberapa benar-benar mati misalnya cmdidThisWindow

Akan menyenangkan untuk dapat melihat mana yang termasuk dalam kategori terakhir.

Benar, kami tidak dapat menghapus const yang digariskan oleh kompiler dari sumbernya. ILLink beroperasi pada msil dan tidak dapat membedakan konstanta yang benar-benar mati dari konstanta yang menjadi mati karena telah digariskan di mana-mana.

Itu juga menandai sebagai mati semua konstruktor default pribadi, yang tidak ingin kami hapus secara umum karena mereka ada untuk mencegah konstruksi tanpa parameter yang tidak disengaja. Saya berasumsi itu tidak dapat dihindari, untuk alasan yang sama. Mereka tidak memiliki tujuan apa pun setelah waktu kompilasi sejauh yang saya bisa pikirkan.

Menandai sebagai 'mudah' per diskusi di atas. Saya berencana untuk menunjukkan beberapa kontributor pertama kali untuk masalah ini.

Jika ada yang mengambil file, tolong katakan demikian pada masalah ini, untuk menghindari duplikasi pekerjaan.

@danmosemsft apakah Anda ingin menambahkan cara Anda mengirim ke vendor di sini juga? Mungkin menambahkannya ke posting teratas akan menjadi yang terbaik, dengan semua pengecualian / hal yang harus dihindari ...

@karelz selesai

Saya telah melihat sepintas di diff. Ada terlalu banyak kebisingan di dalamnya - sulit bagi saya untuk menemukan sesuatu yang mudah dan dapat ditindaklanjuti. Bisakah kita memfilter noise dari diff (consts, konstruktor tanpa parameter pribadi, ...) sehingga hanya memiliki item yang dapat ditindaklanjuti dengan mudah?

Anda dapat membuka CSV dan menerapkan filter apa pun yang Anda suka.

Akan menyenangkan untuk mengutak-atik CSV master untuk melihat kode apa di /src/common yang sebenarnya mati.

@erozenfeld saya mungkin kehilangan sesuatu di sini. dikatakan di http://tempcoverage.blob.core.windows.net/report2/System.Reflection.DispatchProxy.diff.html bahwa EventAccessorInfo.InterfaceRaiseMethod sudah mati, tetapi disetel dalam konstruktor, yang sebenarnya tidak mati.
https://github.com/dotnet/corefx/blob/master/src/System.Reflection.DispatchProxy/src/System/Reflection/DispatchProxyGenerator.cs#L919

menghapus up-for-grabs dan mudah, saya rasa belum siap (jangan ragu untuk mengubah jika menurut Anda saya salah)

Saya tidak melihat bagaimana itu tidak siap, instruksinya cukup jelas ... saya pikir ini semacam pengenalan yang bagus. Bagaimanapun, pedagang kaki lima akan memulainya. Saya sudah melakukan beberapa dan memeriksa banyak yang sudah bersih.

Hal lain yang salah ditandai mati: string yang dimuat saat runtime melalui SR.GetResourceString("..."). Sayangnya masih ada beberapa misal return SR.GetResourceString("PropertyCategory" + value, null);

Itu harus tertangkap di tinjauan kode.

Dari membaca sekilas utas, sepertinya ada masalah noise dalam hasil. Sekali lagi, saya tidak merasa kuat - jangan ragu untuk membaliknya ;-)

Tidak apa-apa :)

Di System.Transactions.Local, ada kode yang saat ini tidak diakses, tetapi sebagian dari kode tersebut pada akhirnya akan diakses setelah kami melakukan pekerjaan untuk mendukung transaksi terdistribusi. Saya enggan untuk menghapus kode ini.

Saya telah menghapus beberapa kode mati yang diidentifikasi di sini di Microsoft.CSharp dan beberapa lagi (analisis tidak menemukan bahwa misalnya ExpressionBinder.BindPtrToArray mati sesuai dotnet/corefx#17948) dan sisanya ada di saya pemandangan sebagai bagian dari refactoring saya yang sedang berlangsung dari majelis itu.

@danmosemsft Mengenai EventAccessorInfo.InterfaceRaiseMethod: dikatakan bahwa get_InterfaceRaiseMethod sudah mati dan karena tidak ada set_InterfaceRaiseMethod, propertinya mati. Kode dalam konstruktor menyetel bidang dukungan yang dihasilkan oleh kompilerk__BackingField dan ILLink menyimpan bidang tersebut.

@jimcarley itu masuk akal, saya memeriksa S.Transactions.Local di atas sebagai selesai. Saya kira jika ada peluang dan tujuan yang benar-benar mati, Anda mungkin ingin menghapusnya di beberapa titik.

@JonHanna jika Anda yakin bahwa ILLink seharusnya mampu menemukan kode itu sudah mati, saya akan memberi tahu @erozenfeld .

@danmosemsft Saya akan sangat terkesan jika bisa, maksud saya hanya bahwa bit yang disebutkan di sini sudah merupakan bagian dari penghapusan yang ingin saya lakukan, sehingga item dalam daftar akan dibahas.

@danmosemsft @JonHanna ILLink tidak berusaha menemukan kode yang tidak dapat dijangkau dalam metode. Jika suatu metode dapat dijangkau, ia mengasumsikan bahwa semua instruksi dalam metode tersebut dapat dijangkau.

Untuk kepentingan orang lain: kasus lain muncul secara offline, di mana bidang int ditugaskan oleh konstruktor yang ditandai sebagai mati. Namun, bidang itu dibaca di tempat lain, dan setelah konstruktor itu dihapus, kompiler memperingatkan bahwa bidang itu tidak pernah disetel. Pembaca sedang membaca nilai default. Dalam kasus seperti itu maka bidang perlu diinisialisasi secara eksplisit saat menghapus setter mati.

@erozenfeld kode ini muncul mati: https://github.com/dotnet/corefx/compare/master...danmosemsft :dead.xml?expand=1
tetapi tidak ditandai sebagai mati. Itu ada di IL (bidang dalam struct). apakah ILLink secara khusus menghindari menghapus bidang dari struct jika misalnya digunakan dalam interop?

Dalam kasus khusus ini, bidang diinisialisasi dalam konstruktor statis implisit sehingga tampaknya digunakan dalam IL. Untuk mendeteksinya sebagai kode mati, ILLink harus:

  • Deteksi bahwa bidang ditetapkan dalam konstruktor statis dan nilainya tidak digunakan di tempat lain
  • Penugasan bidang ini tidak memiliki efek samping
  • Tulis ulang badan metode dari konstruktor statis untuk menghapus penetapan bidang ini, tetapi pertahankan yang lainnya tetap utuh.

Ah - tentu saja.

Saya perhatikan ini seperti di https://github.com/dotnet/corefx/pull/18395/files .. temuan lain di sana adalah berbagai konstanta yang mati (yang tentu saja ILLink tidak tahu karena menunjukkan semua konstanta sebagai mati) dan beberapa hal seperti inisialisasi yang hanya diketahui oleh manusia tidak memiliki efek samping. Tidak ada yang seharusnya ditemukan oleh ILLink.

@huanwu alat SGEN memiliki 400KB kode mati.
Apakah semua ini masuk akal untuk dihapus atau sedang dalam proses, Anda akan menggunakan kode ini?

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

Di System.Linq dan System.Linq.Queryable satu-satunya kode yang ditandai adalah konstanta yang digunakan atau metode dalam file umum di mana metode lain dari kelas yang sama digunakan dalam proyek itu, sehingga tidak memerlukan pekerjaan lebih lanjut.

Saya baru saja mengidentifikasi beberapa kode mati menggunakan alat yang saya tulis - lihat https://github.com/dotnet/corefx/pull/18395 . Saya menggunakan kode Anda sebagai data input untuk memvalidasi kode saya.

Di masa lalu saya telah melakukan penghapusan besar-besaran pada Roslyn (18.5 kloc) yang pandai mengidentifikasi kode yang tidak boleh mati - lihat komentar di https://github.com/dotnet/roslyn/pull/17630. yaitu Hanya digunakan dalam debugger, karena regresi, implementasi tes yang tidak lengkap, harus dikompilasi secara kondisional.

@JonHanna terima kasih! Posting teratas diperbarui dengan info Anda.

dotnet/corefx#18414 menghapus sebagian besar kode mati yang relevan di S.Linq.Expressions. Selain konstanta dll. masih ada beberapa yang mungkin menjadi relevan jika fitur yang saat ini tidak didukung di-porting (termasuk satu dengan masalah yang meminta hal itu) jadi mungkin sebaiknya tidak melakukan lebih jauh sekarang.

Kedengarannya bagus, sudah dicentang dalam daftar. Sebagian besar sisanya hanya membutuhkan pembersihan minimal. SGEN adalah pengecualian utama ( @huanwu silakan lihat pertanyaan di atas)

@zhenlan pertanyaan di atas tentang Microsoft.XmlSerializer.Generator.dll -- ada 400KB kode mati (!) ... apakah kode ini mati sementara, atau apakah Anda selesai dengan pekerjaan ini dan seseorang dapat menghapusnya? Saya dapat meminta vendor untuk melakukan banyak pekerjaan, kemungkinan besar. Kabari saja.

@danmosemsft Ini bukan kode mati. Sebagian besar kode dibagikan dengan System.Private.Xml. Jika Anda memeriksa file proyek https://github.com/dotnet/corefx/blob/master/src/Microsoft.XmlSerializer.Generator/src/Microsoft.XmlSerializer.Generator.csproj , Anda dapat menemukan sebagian besar file kode berada di bawah $(SourceDir)SystemXmlSerialization

@huanwu bahkan jika kami tidak dapat menghapus kode dari repo (karena digunakan oleh orang lain) jika kode tersebut tidak digunakan dalam Majelis ini, kami idealnya tidak akan mengompilasinya ke dalam Majelis.
ReflectionAwareCodeGen
XmlSerializationWriterCodeGen
XmlSerializationCodeGen
semua kelas tampak mati. Idealnya mereka dapat dipindahkan ke file kode mereka sendiri sehingga mereka hanya dikompilasi di tempat yang dibutuhkan.

ReflectionAwareCodeGen sebenarnya dalam #if XMLSERIALIZERGENERATOR jadi mungkin itu benar-benar mati, jika mati di Majelis ini.

Juga sebagian besar string tidak digunakan dalam biner ini.

Jika kode ini mati di Majelis ini, itu akan menghemat 400KB jadi itu layak dilakukan.

Hai @danmosemsft , Saya mungkin tidak sepenuhnya mengerti bagaimana kode mati ditentukan, tetapi ada sesuatu yang terasa aneh.

Misalnya, file diff Microsoft.XmlSerializer.Generator ditandai ReflectionAwareCodeGen sebagai merah, yang saya tafsirkan sebagai kode mati dari sudut pandang alat. Namun, ini jelas digunakan dalam Microsoft.XmlSerializer.Generator di sini . Bisa tolong bantu jelasin?

OK, saya melihat alat ini benar-benar menandai seluruh rantai *CodeGen sebagai kode mati. Tolong abaikan pertanyaan saya sebelumnya dan biarkan saya menjelaskannya. Proyek Microsoft.XmlSerializer.Generator baru saja melakukan check-in awal. Beberapa kode hanya mati sementara. Mereka akan digunakan ketika kita memiliki lebih banyak pekerjaan yang dilakukan. Mungkin kita bisa menjalankan alat itu lagi ketika kita mendekati kode yang lengkap?

@zhenlan itulah yang saya asumsikan. Kode lengkap minggu lalu sebenarnya :) Mungkin ini adalah DCR. Apakah ada banyak lagi yang harus dilakukan?

@danmosemsft ya apa yang Anda anggap benar :)

Microsoft.XmlSerializer.Generator (Sgen) adalah alat CLI yang tidak dikirimkan sebagai bagian dari .NET Core. Untuk bagian kode yang dibagikan Sgen dengan S.Private.Xml, saya rasa tidak ada celah besar kecuali perbaikan bug dan kami menargetkan 5/10 untuk ZBB. Untuk bagian kode yang hanya berada di bawah Sgen, ada lebih banyak pekerjaan fitur yang harus dilakukan tetapi kita harus memiliki lebih banyak kelonggaran karena kendaraan rilis yang berbeda. Semoga ini menjelaskan.

@erozenfeld sebagian besar kode yang dapat dihapus yang tersisa kemungkinan merupakan bagian dari file bersama yang umum yang tidak digunakan siapa pun. Tanpa menganalisis masing-masing dengan tangan atau melakukan penggabungan CSV yang melelahkan, tidak mungkin untuk membersihkan kode itu. Apakah ada cara langsung untuk menjalankan ILLink di seluruh rangkaian rakitan, menggabungkan file yang digunakan di banyak rakitan, sehingga kita bisa mendapatkan salah satu laporan HTML ini yang menunjukkan apa yang mati dalam kode umum?

Kami juga ingin menggabungkan dalam rakitan pengujian karena beberapa pengujian dikompilasi dalam kode produk (misalnya PathInternal.cs). Juga yang Unix karena tentu saja mereka menggunakan kode umum.

@danmosemsft Alat saya bisa melakukan itu. yaitu Jalankan di seluruh basis kode, secara otomatis menghapus baris termasuk positif palsu, buat dan kembalikan berulang kali kemudian uji. Terakhir, dorong ke akun Github saya dan buat permintaan tarik. Mungkin cukup banyak pekerjaan yang terlibat, jadi jangan dicoba kecuali itu akan digunakan. Lihat https://github.com/dotnet/corefx/pull/18395 untuk hasil pada subset

@danmosemsft

Apakah ada cara langsung untuk menjalankan ILLink di seluruh rangkaian rakitan, menggabungkan file yang digunakan di banyak rakitan, sehingga kita bisa mendapatkan salah satu laporan HTML ini yang menunjukkan apa yang mati dalam kode umum?

Tidak, tidak ada cara langsung untuk melakukannya. ILLink beroperasi pada rakitan, bukan file sumber yang digunakan untuk membuatnya.

@erozenfeld Saya tidak berpikir itu yang saya maksud. Saya tidak berharap ILLink beroperasi di atas sumber. Tetapi sekarang semua sumber bersama yang ditampilkan sebagai mati dalam biner X tidak dapat dengan mudah dihapus karena dapat digunakan oleh biner Y atau Z. Jika secara umum semua perpustakaan kami dikompilasi ke dalam satu dll besar seperti ILMerge atau sejenisnya telah berjalan, dengan pdb diperbaiki dengan tepat, maka kami dapat menghapus kode umum apa pun yang muncul sebagai mati. Pertanyaan saya adalah apakah ILMerge dapat menggabungkan rakitan menjadi satu, lalu menjalankan analisis penutupan di atasnya.

@danmosemsft Tidak, ILLink tidak dapat menggabungkan rakitan menjadi satu seperti yang dilakukan ILMerge. Saya tidak tahu bagaimana ILMerge menangani nama yang bentrok di seluruh majelis. Jika Anda memiliki kelas NC di Majelis A dan kelas NC di Majelis B, secara umum Anda harus menyimpan keduanya (dan mengganti nama salah satu atau keduanya) saat menggabungkan kecuali Anda dapat membuktikan bahwa keduanya identik dalam arti yang mendalam.

Kena kau. Yah mungkin sebuah pendekatan akan muncul di masa depan. Itu bukan masalah besar.

Saya juga berpikir bahwa itu bisa dilakukan dengan beberapa pemrosesan CSV ...

Semua data ini kemungkinan sudah ketinggalan zaman sekarang. Kami mungkin harus menjalankan kembali laporan jika Anda ingin melakukan lebih banyak pekerjaan dalam hal ini. Anda dapat menemukan petunjuk untuk melakukannya di bagian latar belakang di atas.

Di System.Collections.Immutable dan System.Collections.NonGeneric satu-satunya kode yang ditandai adalah konstanta yang digunakan atau metode dalam file umum di mana metode lain dari kelas yang sama digunakan dalam proyek itu, sehingga tidak memerlukan pekerjaan lebih lanjut.

Terima kasih @YoupHulsebos , posting teratas diperbarui.

Di System.IO.FileSystem.Watcher dan System.Security.Cryptography.Primitives satu-satunya kode yang ditandai adalah konstanta yang digunakan atau metode dalam file umum di mana metode lain dari kelas yang sama digunakan dalam proyek itu, sehingga tidak memerlukan pekerjaan lebih lanjut.

@yaelkeemink terima kasih kotak centang yang diperbarui.

Halo,
Sebagai kontributor pertama kali, saya ingin menangani perpustakaan System.Net.Mail jika tidak apa-apa!

Tentu, terima kasih! Lanjutkan. Jika Anda menemukan hambatan apa pun, ping kami di sini untuk mengajukan masalah baru (dan beri tag saya untuk perutean).

Saya telah membuat permintaan tarik untuk System.Net.Mail dan menandatangani perjanjian.

Terima kasih @Ermiar! Masalah teratas diperbarui dengan tautan ke PR.

Pertama kali di sini - saya akan mengambil yang berikut:

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

🗄.

Luar biasa, selamat datang di @garfbradaz!
Beri tahu kami ketika Anda mengirimkan PR, kami akan memperbarui posting teratas ( @ViktorHofer dapatkah Anda membantu hari ini?)

Tentu.

@garfbradaz pastikan setelah menghapus kemungkinan kode mati untuk menjalankan semua tes di kedua proyek untuk Desktop dan Core.
Anda dapat melakukan ini dengan terlebih dahulu menjalankan:
build.cmd dan build.cmd -framework:netfx dari corefx root dan setelah itu jalankan proyek pengujian individual seperti ini:
msbuild /t:RebuildAndTest dan msbuild /t:RebuildAndTest /p:TargetGroup=netfx .

Jangan ragu untuk menghubungi saya jika Anda membutuhkan bantuan. Terima kasih atas bantuan Anda!

Terima kasih @ViktorHofer / @karelz - perlahan-lahan membajak

Ada positif palsu: dotnet/corefx#19826 diimplementasikan dengan kode dihapus oleh komit 81506698 pada masalah ini. Meskipun metode ini 'mati' untuk saat ini, penting untuk berada di sana untuk mengembalikan DbProviderFactories dari .NET penuh. Jadi akan dibangkitkan jika PR dotnet/corefx#19826 digabungkan.

Kontributor pertama kali, saya ingin mencoba System.Linq.Expressions.

Hebat @mccbraxton! Jika Anda butuh bantuan, ping saya.

@mccbraxton Tampaknya System.Linq.Expressions sudah dibersihkan. Apakah Anda ingin mengambil bagian lain?

@ViktorHofer Anda benar - pasti salah membaca. Bagaimana dengan System.Security.Cryptography.Algorithms?

Kelihatan bagus! Saya menambahkan Anda di tabel. Harap pastikan untuk tidak menghapus kode yang digunakan oleh target mana pun. Terima kasih atas bantuan Anda!

dotnet/corefx#18162 menangani apa yang tersisa dalam laporan untuk Microsoft.CSharp yang benar-benar mati.

Halo kontribusi baru di sini, saya dapat mengambil System.ComponentModel.*

Terima kasih @norek, lanjutkan.

Hai di bawah ringkasan System.ComponentModel.

  • root - Tidak ada yang perlu dihapus
  • .Anotasi - tidak ada yang perlu dihapus
  • .EventBasedAsync - tidak ada yang perlu dihapus
  • .Primitif - ditandai sebagai mati tetapi tidak
  • .TypeConverters - saya menghapus beberapa kode. Tapi saya bingung dengan operator != - itu ditandai sebagai mati tetapi saya tidak tahu semua konvensi pengkodean Anda - harus dihapus juga?

Saya sedang meninjau daftar dan saya menemukan kode mati di System.Diagnostics - StackTraceSymbols ditandai sebagai mati tetapi nama kelas ini dalam solusi exlorer adalah StackTraceSymbols.CoreCLR.cs . Saya menemukan dalam masalah tertutup: dotnet/corefx#19368
dan mati atau tidak?

@mikem8361 apakah Anda memiliki SDStackTraceSymbols?

Saya memilikinya dan itu bukan kode mati. Refleksi digunakan oleh System.Private.CoreLib untuk memuat rakitan ini dan mereferensikan kelas ini.

Jadi coreclr dapat mencetak info nomor sumber/baris pada jejak tumpukan pengecualian yang tidak tertangani.

@mikem8361 terima kasih atas informasinya. Sepertinya dilindungi oleh illlinktrim.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 dapatkah kita memperbaiki CSV yang dipancarkan ILLink sehingga tidak menunjukkan kode mati ketika kita memaksanya untuk mempertahankan kode?

CSV yang kami miliki hanyalah perbedaan setelah pemangkasan, jadi mereka tidak memiliki barang yang di-root secara eksplisit. Data yang ditautkan dalam masalah ini tidak aktif. Ini dari lari satu kali ketika saya membuka masalah. Saya menduga jika Anda melihat info langsung, itu tidak lagi ditampilkan sebagai perbedaan.

Halo, saya kontributor pertama kali. Saya ingin mencoba System.Net.Http dan System.Net.HttpListener.

@soapdogg lakukanlah ..

@AlexGhiondea seperti yang disebutkan

Halo. Bisakah saya mengambil Microsoft.VisulaBasic ?

@ satano pasti, silakan. Sepertinya hanya ada beberapa bit yang harus dihapus (semua bidang const dan ctor tanpa parameter harus tetap ada, per artikel saya di atas). Mungkin Anda bisa melakukan CSharp juga?

Ada juga beberapa perpustakaan yang baru sejak analisis di atas dilakukan...

OK, saya akan melakukan CSharp dan VisualBasic.

PR untuk Microsoft.VisualBasic sudah siap.

Mengenai Microsoft.CSharp - semua yang berwarna merah di file diff sudah dihapus. Jadi, tandai saja di edisi.

Apakah kita akan menyerahkan masalah ini kepada pemula, atau dapatkah saya melanjutkan?

@ satano dapatkah Anda menemukan perubahan yang menghilangkan perbedaan merah?
Tidak apa-apa untuk melanjutkan, kami tidak menyimpannya hanya untuk pemula.

Saya tidak tahu apakah itu semua, tetapi ada sesuatu yang dihapus di sini: https://github.com/dotnet/corefx/commit/3eb339702e2fcdf924b50c2e32d7e9e02395e52f

@JonHanna bahkan mengatakannya di sini https://github.com/dotnet/corefx/issues/17905#issuecomment -291924301

Saya akan melanjutkan dari atas. Jadi selanjutnya saya akan mengambil System.IO.Compression , System.IO.FileSystem.AccessControl , dan System.IO.FileSystem .

@ satano lakukan -- tidak perlu meminta izin, jika orang lain mencari, mereka akan memposting di sini.

Satu "masalah meta" yang menarik bagi seseorang adalah apakah ada cara untuk menggunakan alat penghubung yang sama untuk menemukan kode umum yang tidak digunakan siapa pun. Jika kelas yang ditarik dari srccommon hanya digunakan sebagian oleh perpustakaan, itu akan muncul mati dalam analisis ini, tetapi tidak dapat dihapus karena perpustakaan lain mungkin menarik dan menggunakannya. Apa yang saya pikirkan adalah jika ada cara untuk menggabungkan majelis, lalu jalankan tautannya. @erozenfeld bisakah kita menggunakan tautan untuk menggabungkan, lalu menemukan kode mati pada hasilnya?

ILLink saat ini tidak dapat menggabungkan rakitan. Ini adalah sesuatu yang kami pertimbangkan untuk ditambahkan di masa mendatang. Ada alat lain yang dapat melakukan itu: https://github.com/Microsoft/ILMerge dan https://github.com/gluck/il-repack meskipun saya tidak yakin apakah mereka menangani skenario ini seperti yang kita inginkan. Mereka mungkin atau mungkin tidak menyadari bahwa tipe/metode/bidang dengan nama yang bentrok mewakili entitas yang identik.

Saya melanjutkan dengan System.Net.Http , System.Net.HttpListener dan System.Net.NetworkInformation .

Saya akan mengambil seluruh System.Net.* satu per satu.

Melanjutkan sisanya: System.Private.* , System.Runtime.* dan System.Security.* .

@karelz

… dapatkah Anda menemukan perubahan yang menghilangkan perbedaan merah?

dotnet/corefx#18162

Yah... Mungkin sudah waktunya untuk meninjau masalah ini dan mungkin menutupnya?

Kode mati dari proyek ini telah dihapus dan digabungkan:

  • Microsoft.CSharp (sudah dilakukan sebelumnya seperti yang disebutkan dalam komentar di atas)
  • Microsoft.VisualBasic
  • System.IO.Compression
  • System.IO.FileSystem
  • System.IO.FileSystem.AccessControl
  • System.Net.Http
  • System.Net.HttpListener
  • System.Net.NetworkInformation
  • System.Net.Primitif
  • System.Net.Requests
  • Sistem.Net.Keamanan
  • System.Net.Socket
  • System.Net.WebClient
  • System.Net.WebSocket.Client
  • System.Private.DataContractSerialization
  • Sistem.Pribadi.Uri
  • System.Security.Cryptography.Cng
  • System.Security.Cryptography.Csp

Saya juga melihat sisa proyek dan tidak ada yang bisa dilakukan di dalamnya:

  • System.Net.WebHeaderCollection
  • System.Net.WebSockets
  • Sistem.Waktu Proses
  • System.Runtime.Serialization.Primitives
  • System.Security.AccessControl
  • Sistem.Keamanan.Klaim
  • Sistem.Keamanan.Kriptografi.Algoritme
  • System.Security.Cryptography.Encoding
  • System.Security.Cryptography.OpenSsl

Jadi satu-satunya proyek yang tersisa adalah Microsoft.XmlSerializer.Generator . Ini memiliki sebagian besar kode mati, tetapi seperti yang disebutkan dalam beberapa komentar di sini, ada pekerjaan yang sedang berlangsung di sana - seperti yang saya pahami.

Apakah masalah ini selesai? Jika tidak, bisakah saya mengambil System.Console ?

@Iroca88 yakin. Perhatikan dump yang ditautkan di atas mungkin sedikit ketinggalan zaman sekarang.

Terima kasih @danmosemsft , ada saran untuk mendapatkan dump baru? Kalau tidak, saya akan mulai dengan dump yang disediakan di atas.

BTW: adalah @lroca88 , saya menggunakan huruf besar pertama (L) untuk menghindari jenis kebingungan :)

@ Lroca88 posting teratas menjelaskan cara mengakses rakitan yang dipangkas dan dipotong sebelumnya. Untuk membedakannya, kami menggunakan alat yang tampaknya tidak bersifat publik. Anda dapat menggunakan dekompiler seperti Ilspy On keduanya dan melakukan perbedaan teks pada hasilnya. Itu mungkin akan berhasil.

Saya akan menjalankan diff terbaru dan membagikannya. Tetap disini.

Berikut yang terbaru:

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

Keren, saya berjuang dengan daftar lama! 🔨.

@Lroca88 pastikan untuk membaca petunjuk posting teratas tentang cara melakukan pass ini, simpan beberapa kebingungan ..

Ups. Saya melewatkan dua bit baru yatim piatu di Microsoft.CSharp di dotnet/corefx#26491. Aku akan segera mendapatkannya.

Dari daftar baru, System.Runtime, System.Web.HttpUtility, System.Linq dan System.Linq.Queryable hanya memiliki konstanta yang tidak benar-benar mati dan beberapa kode bersama. System.Linq.Expressions memiliki itu dan beberapa item yang digunakan dalam tampilan debug dan sumber daya yang digunakan dengan konstanta kompiler tertentu dan karenanya harus dihapus, sehingga kelimanya dapat dicentang.

Saya telah menggabungkan perpustakaan yang diulas oleh @JonHanna dan yang saya ulas ke dalam daftar. Saya akan terus memperbarui daftar sesuai waktu saya, jika seseorang ingin menambahkan item ke daftar ini, silakan ping saya!

Perpustakaan | Diulas oleh | Status
-- | -- | --
Microsoft.CSharp (csv) | @JonHanna | dotnet/corefx#27104
Microsoft.VisualBasic (csv) | @Lroca88 | Tidak ada yang perlu dihapus
Microsoft.Win32.Primitives (csv) | @Lroca88 | Tidak ada yang perlu dihapus
Microsoft.Win32.Registry (csv) | @Lroca88 | Tidak ada yang perlu dihapus
System.Collections.Concurrent (csv) | @Lroca88 | Tidak ada yang perlu dihapus
System.Collections (csv) | @Lroca88 | Tidak ada yang perlu dihapus
System.Runtime (csv) | @JonHanna | Tidak ada yang perlu dihapus
System.Web.HttpUtility (csv) | @JonHanna | Tidak ada yang perlu dihapus
System.Linq (csv) | @JonHanna | Tidak ada yang perlu dihapus
System.Linq.Queryable (csv) | @JonHanna | Tidak ada yang perlu dihapus

Terima kasih @Lroca88 !

Tidak mengejutkan saya bahwa tidak banyak kode mati yang tersisa. Namun seperti yang disebutkan di atas, proses ini tidak dapat menentukan apakah kode di srccommon sudah mati (karena mungkin muncul mati di satu Majelis tetapi tidak di yang lain). Jika Anda tertarik untuk menemukan cara untuk menyelesaikannya, Anda mungkin akan menemukan lebih banyak kode mati. Misalnya, mungkin ILMerge majelis dan kemudian menjalankan analisis kode mati pada mereka. Atau, mungkin lebih mudah untuk memposting proses CSV untuk menemukan kode umum yang mati di semuanya. @ericstj apakah Anda punya ide?

Dengan senang hati saya membantu @danmosemsft ,
Saya setuju dengan Anda, tentang meningkatkan proses ini, dari ulasan saya kode yang paling ditandai tidak mati, baik consts atau sering digunakan di Majelis lain seperti yang Anda katakan sebelumnya. Melihat positif palsu itu membuat perburuan sedikit membosankan menurut saya.

Sayangnya saya tidak tahu bagaimana melakukan ILMerge dan analisis kode mati atau proses pasca CSV. Saya bersedia belajar/berkolaborasi, jika kalian ingin meluangkan waktu untuk mengajari saya :)

Di mana kita dengan ini? Apakah OP terus diperbarui dengan kelas yang sudah selesai atau haruskah kita menghentikan komentar ini sekarang?

@MisinformedDNA -- gunakan https://github.com/dotnet/corefx/issues/17905#issuecomment -365349091 tolong

Saya tidak tahu bagaimana melakukan ILMerge dan analisis kode mati atau proses pasca CSV. Saya bersedia belajar/berkolaborasi, jika kalian ingin meluangkan waktu untuk mengajari saya :)

Saya juga tidak tahu dan harus berpikir/bereksperimen. Saat ini saya sepenuhnya terlibat menutup rilis 2.1 jadi ini harus menunggu sebentar

Saya menulis skrip untuk memuat semua CSV dan kemudian memfilter ke yang paling dapat ditindaklanjuti. Saya menemukan 3.942 masalah/peluang.

Sekarang saya bermaksud untuk melihat setiap masalah dan mengambil tindakan yang tepat. Anda dapat mengikuti kemajuan saya dan meninggalkan umpan balik, jika Anda mau, di https://github.com/MisinformedDNA/corefx/tree/clean-dead-code

Bagus, menantikan untuk melihat @MisinformedDNA ini.

Saya menemukan masalah dengan analisis kode mati, yang menunjukkan masalah atau kekurangan alat.

Laporan tersebut mengatakan bahwa berikut ini dapat dihapus:

    Friend Enum vbErrors
        ObjNotSet = 91
        IllegalFor = 92
    End Enum

Tetapi Enum ini direferensikan di tempat lain, jadi mari kita lihat satu kemungkinan cabang:

    ' 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

Logika telah membawa saya ke tempat di mana pernyataan "Jika" pertama tidak pernah benar. Tetapi pernyataan "Jika" itu adalah cek null , jadi kita harus berasumsi bahwa seseorang akan memasukkan null dan bahwa ada kasus yang hilang untuk menentukan kode mati. Dan jika ada masalah (atau lebih) dengan menentukan kode mati, maka satu atau lebih Enum mungkin bukan kode mati.

tldr: Ringkasan

Pertanyaan 1: Mengapa VbMakeIllegalForException tidak ditandai untuk dihapus, meskipun tidak mungkin memanggil enum yang ditandai untuk dihapus.
Pertanyaan 2: Mengapa kasus uji dalam menentukan kode mati, tidak meneruskan nilai nol untuk semua parameter yang berlaku?

@ericstj

Nilai enum mungkin digariskan dalam msil sehingga alat tidak melihatnya. Hal yang sama berlaku untuk konstanta. Tidak ada yang harus dilakukan untuk kode sumber dalam kasus ini.

Saya baru saja selesai menghapus kode mati untuk System.Data.Common dengan build.cmd src\System.Data.Common berhasil diselesaikan. Sekarang sampai sekarang, saya mendapat kesan bahwa saya hanya perlu bekerja di perpustakaan tempat saya berada dan jika build dan pengujiannya lulus, maka saya siap melakukannya. Tapi saya memutuskan untuk melakukan full build, dan saya senang melakukannya, karena saya mendapatkan banyak kesalahan.

Berikut adalah beberapa contoh kesalahan:

SystemDataSqlClientSqlCommandBuilder.cs(277,17): kesalahan CS0117: 'ADP' tidak berisi definisi untuk 'RemoveStringQuotes' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataProviderBaseDbConnectionPool.cs(984,33): kesalahan CS0117: 'ADP' tidak berisi definisi untuk 'SetCurrentTransaction' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
D:ReposcorefxsrcCommonsrcSystemDataProviderBaseDbMetaDataFactory.cs(409,21): kesalahan CS0117: 'ADP' tidak berisi definisi untuk 'IsEmptyArray' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]
SystemDataCommonDbConnectionStringCommon.cs(180,27): kesalahan CS0117: 'ADP' tidak berisi definisi untuk 'InvalidConnectionOptionValue' [D:ReposcorefxsrcSystem.Data.SqlClientsrcSystem.Data.SqlClient.csproj]

Semua anggota yang hilang secara jelas ditentukan untuk dihapus di System.Data.Common.diff.html , tetapi mereka tidak hanya menyebabkan kesalahan di kelas anak, tetapi tidak ada file diff untuk kelas anak ini atau ada rakitan terkait seperti System.Data.SqlClient .

Kesalahan pertama yang ditunjukkan di atas terkait dengan metode publik, SqlCommandBuilder.UnquoteIdentifier . Jadi saya tidak melihat bagaimana ADP.RemoveStringQuotes dapat dihapus dari System.Data.Common tanpa merusak perubahan di kelas lain.

Bagaimana saya harus menangani ini? Adakah ide mengapa mereka ditandai untuk dihapus?

@anipik dapatkah Anda membantu @misinformeddna di sini?

@MisinformedDNA Anda harus selalu membangun seluruh repo dan menjalankan tes untuk semua perpustakaan karena mungkin satu perpustakaan dapat bergantung pada perpustakaan lain secara langsung (A menggunakan beberapa jenis dari B) atau tidak langsung. (A menggunakan beberapa tipe dari B yang menggunakan beberapa tipe dari C)
Tidak ada dalam fungsi ADP.removeStringQuotes , isemptyarray , setTransaction yang hanya khusus untuk ApaterUtil atau System.Data.Common jadi kita bisa memindahkannya ke sqlCommandBuilder.cs sebagai metode statis pribadi. Mereka hanya memanipulasi argumen. Jika Anda dapat mengarahkan saya ke cabang yang mengalami kegagalan ini, saya dapat membantu Anda dengan kegagalan lainnya.

Semua metode yang Anda sebutkan di atas adalah internal static methods yang tidak lagi digunakan dalam Majelis yang ditentukan.
Anggota internal umumnya tidak dimaksudkan untuk digunakan di luar majelis yang ditentukan. tetapi dalam beberapa kasus kami melakukannya dengan menggunakan atribut ``Internals Visible To```.

@danmosemsft memindahkan fungsi internal ini ke majelis di mana mereka digunakan secara optimal?

Inilah garpu yang sedang saya kerjakan: https://github.com/MisinformedDNA/corefx/tree/clean-dead-code

Seperti yang dinyatakan sebelumnya, analisis kode mati mengatakan ADP.RemoveStringQuotes untuk System.Data.Common dapat dihapus. Namun, karena ADP ditandai internal , penganalisis mungkin berasumsi bahwa itu tidak digunakan di luar perakitan. Saya tidak yakin apakah itu mencari atribut InternalsVisibleTo , tetapi tidak masalah jika itu muncul, karena tidak digunakan di sini. Sebaliknya, itu dibagikan melalui file yang ditautkan.

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

Saya berasumsi penganalisa melihat kelas ADP yang berbeda sebagai tipe yang terpisah, alih-alih dibagikan, karena pada dasarnya mereka sedang diduplikasi. Jadi sementara menghapus RemoveStringQuotes adalah hal yang benar untuk dilakukan untuk System.Data.Common , itu adalah hal yang salah untuk dilakukan ketika mempertimbangkan proyek lain yang terkait dengannya.

Kecuali jika penganalisa dapat menentukan bahwa semua kelas tersebut berasal dari file yang sama, kami akan terus-menerus berpikir bahwa kami memiliki kode mati di beberapa file ini.

Kecuali, seseorang memiliki saran yang lebih baik, saya akan mulai menambahkan metode ini kembali ke kode.

@MisinformedDNA saya membicarakan hal ini dengan @danmosemsft offline. Pendekatan lain yang mungkin adalah membuat kelas ADP parsial. Dan kemudian Anda dapat memindahkan fungsi ini ke perpustakaan ini.

Saya mengajukan PR pertama saya, tetapi 2 build gagal. Kedua kegagalan build tampaknya menunjukkan batas waktu. Tindakan apa yang harus saya ambil untuk menyelesaikan ini?

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

Saya akan melihat System.Private.Uri

Ini adalah aplikasi yang saya tulis untuk mengunduh semua file, menggabungkannya, lalu memfilter semua yang kemungkinan positif palsu. Mudah-mudahan, itu akan bermanfaat bagi orang lain.

@ericstj apakah masuk akal untuk membuat ulang data sehingga kami memiliki gambaran yang lebih jelas di mana kami berada dengan ini?

Dimulai pada ruang nama berikut:

  • System.Collections.Specialized

    • Hanya 2 properti dariCompatibleComparer, tetapi file dalam src/common dan lebih luas digunakan.

  • System.Diagnostics.DiagnosticSource
  • System.Diagnostics.FileVersionInfo
  • Sistem.Diagnostik.Proses
  • System.Diagnostics.StackTrace
  • System.Diagnostics.TextWriterTraceListener
  • Sistem.Diagnostik.Alat
  • System.Diagnostics.TraceSource
  • Sistem.Diagnostik.Pelacakan

Saya telah membuat ulang data. Ini dia sebagai daftar baru, saya tidak ingin menimpa apa yang ada di sana jika orang menganggapnya relevan.

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

Terima kasih Eric!

Diperiksa sebagai berikut:

  • System.IO.Compression.Brotli
  • System.IO.Compression.ZipFile
  • System.IO.FileSystem.DriveInfo
  • System.IO.IsolatedStorage
  • System.IO.MemoryMappedFiles
  • System.IO.Pipe
  • Sistem memori

Membersihkan kode mati untuk:
System.Diagnostics.DiagnosticSource
System.Diagnostics.FileVersionInfo
Sistem.Diagnostik.Proses
System.Diagnostics.StackTrace
System.Diagnostics.TextWriterTraceListener
Sistem.Diagnostik.Alat
System.Diagnostics.TraceSource
Sistem.Diagnostik.Pelacakan
Sistem.Gambar.Primitif

dotnet/corefx#33095

Saya ingin membersihkan System.IO.Compression sebagai kontribusi pertama saya.

Di pos awal System.Console ditandai sebagai selesai, tetapi dalam data yang dibuat ulang tidak ditandai. Saya menemukan bahwa hanya beberapa string SR yang perlu dibersihkan.
Jadi, @ericstj , apakah ini semacam kesalahan atau saya bisa melihat perpustakaan lain dan memperbaiki kode mati kecil seperti itu?

Ringkasan

Saya membuat alat kecil yang menghapus beberapa hal yang tidak berguna dari data ini .


Ini menghilangkan:

  1. Semua const yang ditandai merah.

Ini adalah hal yang sangat umum. Apa pun dengan "const", harap abaikan. Ini semua adalah bidang yang digarisbawahi oleh kompiler, kami ingin menyimpannya di sources. Biasanya int dan string.

  1. Semua barang yang tidak ditandai merah (kode itu tidak mati).

Tetap:

  1. Setiap kelas atau struct level bersarang yang berisi kode mati. Ini membantu untuk menemukan kode itu lebih cepat.
  2. Semua string SR yang dapat dihapus. Tetapi metode SR 's tidak dihapus juga, berhati-hatilah.

Apa pun yang merupakan "string statis" di "kelas SR" adalah istimewa. Alih-alih mengedit file C#, Anda harus menemukan entri yang cocok di file .resx dan menghapusnya. File .resx untuk perpustakaan ada di srcsrcResourcesstrings.resx. Build akan meregenerasi SR setelah Anda melakukan ini. Abaikan hal lain di "kelas SR" -- ada beberapa metode yang mungkin terlihat mati.

  1. Kelas dengan hanya satu konstruktor tanpa parameter. Ini membantu untuk menghindari melakukan apa pun dengan mereka.

Abaikan konstruktor tanpa parameter pribadi apa pun. Kami memiliki ini dalam kode untuk mencegah membuat instance kelas secara tidak sengaja, kami ingin menyimpannya dalam kode.

Abaikan konstruktor tanpa parameter publik jika tidak ada konstruktor lain. Ini tidak nyata.


Juga:

Anda dapat menemukan file yang dibersihkan di sini . Sebutkan saya setelah memperbarui data dan saya akan memperbaruinya.

@ericstj apakah aman untuk menghapus internal enum ?

Setelah menggunakan alat itu, saya telah memeriksa semua rakitan. Beberapa dari mereka tidak memiliki kode mati.
Daftar yang diperbarui terlihat seperti di bawah ini. Saya mengubah tautan ke htmlpreview untuk file yang dihapus dari repositori alat . Semoga tidak ada yang keberatan.

Jadi, @ericstj , apakah ini semacam kesalahan atau saya bisa melihat perpustakaan lain dan memperbaiki kode mati kecil seperti itu?

Saat membuat ulang perbedaan, saya mulai dengan semuanya dibersihkan lagi. Mekanisme untuk melakukan dead-code-diff terlalu manual. Ini menggunakan alat internal untuk perbedaan perakitan.

@ericstj apakah aman untuk menghapus enum internal?

Itu tergantung pada apa yang dilakukan dengan enum internal itu. Enum akan sering muncul sebagai mati dalam biner karena kompiler mengubah referensi sumbernya menjadi literal integer. Anda mungkin akan menemukan bahwa sumbernya mungkin masih membutuhkannya.

Hanya beberapa pemikiran tentang bagaimana kita dapat membuat kode mati ini menggosok pengalaman yang lebih baik yang lebih mapan bergerak maju.

  1. Tambahkan alat pembeda ke tempat terbuka. Saya telah menggunakan AsmDiff yang bersifat internal. Kita bisa open source itu atau membuat sesuatu yang baru di atas library yang ada (SRM, CCI, atau Cecil).
  2. Izinkan proyek untuk ikut serta dalam validasi kode-tanpa-mati ini dan tutupi hal-hal yang terlewatkan oleh alat ini.
  3. Iterasi pada 2 dengan menempatkan heuristik ke dalam aturan yang berbeda dan/atau pemfilteran.
  4. Setelah kami memiliki fungsionalitas yang cukup di perkakas, aktifkan untuk seluruh repo, komit garis dasar di mana kami mengizinkan kode mati dan tidak perlu kembali ke masalah ini lagi

Saat ini mekanisme yang kami gunakan untuk kode mati tree-shaking adalah linker yang beroperasi pada binari. Jadi untuk memetakannya kembali ke sumber, kami membedakan outputnya dengan input dan memancarkan id. Hal lain yang telah saya diskusikan dengan orang-orang penghubung di masa lalu adalah untuk memancarkan lebih banyak logging yang dapat lebih langsung memetakan kembali ke hal-hal yang menjadi perhatian pengembang kami. Ini juga beroperasi pada PDB sehingga secara teknis memiliki semua kode sumber dan informasi baris.

@ericstj apakah secara teknis mungkin dijalankan di corelib? Saya perhatikan metode mati di corelib, dan tidak diragukan lagi ada lebih banyak lagi. Tentu saja itu akan membutuhkan perawatan mengingat semua panggilan balik dari VM

@danmosemsft Sudah berjalan di System.Private.Corelib.dll sebagai bagian dari coreclr build. Apa metode mati yang Anda perhatikan yang tidak dihapus?

@ericstj Saya kira kita bisa menutup ini?

Saya pikir ini dilakukan untuk saat ini. Banyak terima kasih kepada semua yang berkontribusi untuk membuat basis kode kami lebih baik!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat