Hapus referensi yang tidak digunakan (! = "Menggunakan")

100

Bagaimana saya dapat menemukan dan menghapus referensi yang tidak digunakan dalam proyek saya?

Saya tahu Anda dapat dengan mudah menghapus pernyataan penggunaan dalam vs 2008, tetapi ini tidak menghapus referensi aktual dalam proyek Anda. Dll yang direferensikan akan tetap disalin di paket bin / setup Anda.

Boris Callens
sumber
Terima kasih. Sayangnya, tidak ada jawaban yang saya cari ...
Boris Callens
kemungkinan duplikat Alat untuk menemukan referensi yang tidak digunakan
David Schmitt

Jawaban:

55

* Catatan: lihat http://www.jetbrains.net/devnet/message/5244658 untuk versi lain dari jawaban ini.

Membaca postingan, sepertinya ada kebingungan dengan pertanyaan aslinya. Biarkan saya mencobanya.

Posting asli benar-benar mengajukan pertanyaan: "Bagaimana cara mengidentifikasi dan menghapus referensi dari satu proyek Visual Studio ke proyek / rakitan lain yang tidak digunakan?" Poster ingin agar rakitan tidak lagi muncul sebagai bagian dari keluaran build.

Dalam hal ini, ReSharper dapat membantu Anda mengidentifikasinya , tetapi Anda harus menghapusnya sendiri.

Untuk melakukan ini, buka Referensi di Browser Solusi, klik kanan mouse pada setiap rakitan yang direferensikan, dan pilih "Temukan Kode yang Tergantung". Lihat:

http://www.jetbrains.com/resharper/features/navigation_search.html#Find_ReferencedDependent_Code

Anda juga akan mendapatkan:

  1. Daftar dependensi pada Referensi tersebut di jendela browser, atau

  2. Dialog yang memberi tahu Anda "Kode bergantung pada modul XXXXXXX tidak ditemukan.".

Jika Anda mendapatkan hasil kedua, Anda dapat mengklik kanan mouse pada Referensi, pilih Hapus, dan hapus dari proyek Anda.

Meskipun Anda harus melakukannya "secara manual", yaitu satu referensi pada satu waktu, ini akan menyelesaikan pekerjaan. Jika seseorang telah mengotomatiskan ini dalam beberapa cara, saya tertarik untuk mendengar bagaimana hal itu dilakukan.

Anda dapat mengabaikan yang ada di .Net Framework karena biasanya tidak disalin ke output build Anda (biasanya - meskipun tidak selalu benar untuk aplikasi Silverlight).

Beberapa posting tampaknya menjawab pertanyaan: "Bagaimana cara menghapus menggunakan klausa (C #) dari file kode sumber yang tidak diperlukan untuk menyelesaikan referensi apa pun di dalam file itu".

Dalam kasus ini, ReSharper memang membantu dalam beberapa cara:

  1. Mengidentifikasi klausa penggunaan yang tidak digunakan untuk Anda selama deteksi kesalahan dengan cepat. Mereka muncul sebagai Peringatan Pemeriksaan Kode - kode akan tampak abu-abu (menjadi default) di file dan ReSharper akan memberikan Petunjuk untuk menghapusnya:

    http://www.jetbrains.com/resharper/features/code_analysis.html#On-the-fly_Error_Detection

  2. Memungkinkan Anda menghapusnya secara otomatis sebagai bagian dari Proses Pembersihan Kode:

    http://www.jetbrains.com/resharper/features/code_formatting.html#Optimizing_Namespace_Import_Directives

Terakhir, sadari bahwa ReSharper melakukan analisis kode statis pada solusi Anda. Jadi, jika Anda memiliki referensi dinamis ke assembly - katakanlah melalui refleksi atau assembly yang dimuat secara dinamis saat runtime dan diakses melalui antarmuka - itu tidak akan mengambilnya. Tidak ada pengganti untuk memahami basis kode Anda dan ketergantungan proyek saat Anda mengerjakan proyek Anda. Saya menemukan fitur ReSharper sangat berguna.

jlo
sumber
Jawaban ekstensif yang bagus. Yang aneh adalah bahwa meskipun Anda tahu saya tidak mengacu pada pernyataan menggunakan (pembersihan itu standar di VS, jangan mengerti mengapa R # menemukan kembali itu) Anda menjawab pertanyaan itu terlebih dahulu. Maukah Anda mengganti keduanya?
Boris Callens
Akan melakukan. Fitur ReSharper mendahului penerapan Visual Studio. Ini tetap seperti yang dicapai melalui fitur "koreksi otomatis" - Tag Cerdas dimatikan saat Anda memiliki ReSharper.
jlo
1
Sekarang ~ 4 tahun terakhir ReSharper 6.1 mendapatkan fitur tersebut secara langsung!
Julien Roncaglia
Tidak yakin apa yang Anda maksud - ReSharper telah memiliki fitur ini selama bertahun-tahun.
jlo
8
WASPADA: Jika Anda menggunakan jenis refleksi apa pun untuk memuat secara dinamis dari majelis, ini akan menjadi hal yang buruk untuk dilakukan. Anda akan menggunakan "referensi" untuk membawa rakitan ke tempat sampah / produksi, tetapi tidak akan ada kode yang mereferensikannya secara langsung. GUNAKAN DENGAN PERAWATAN!
Casper Leon Nielsen
12

Anda dapat menggunakan ekstensi ' Hapus Referensi yang Tidak Digunakan ' yang saya tulis:

http://visualstudiogallery.msdn.microsoft.com/9811e528-cfa8-4fe7-9dd1-4021978b5097

Spongman
sumber
ekstensi ini tidak dipublikasikan
stombeur
1
Saya suka ini pada awalnya! Tapi kemudian dengan pengujian lebih lanjut, itu menghapus referensi yang saya butuhkan. Detail lebih lanjut tentang kegagalan tersebut ada di sini: wpfsharp.com/2012/04/04/…
Rhyous
5

Coba yang ini: Asisten Referensi

Ringkasan

Referensi asisten membantu untuk menghapus referensi yang tidak digunakan dari proyek C #, F #, VB.NET atau VC ++ / CLI di Visual Studio 2010.

Leniel Maccaferri
sumber
1
mungkin Anda tahu ekstensi serupa untuk vs 2012?
pembuat film
@isxaker Sekarang fitur bawaan dari resharper
itslittlejohn
4

ReSharper 6.1 akan menyertakan fitur-fitur ini:

  • Optimalkan referensi : analisis referensi assembly Anda dan penggunaannya dalam kode, dapatkan daftar referensi yang berlebihan, dan hapus.

  • Hapus Referensi yang Tidak Digunakan : refactoring cepat untuk menghapus referensi perakitan yang berlebihan.

  • Hapus aman pada referensi assembly : akan menghapus referensi assembly jika semuanya redundan, jika tidak, menghilangkan penggunaan dan hanya dapat menghapus referensi assembly yang berlebihan dari daftar yang dipilih.

Kirill Skrygan
sumber
4

ReSharper akan melakukan ini untuk Anda (dan banyak lagi!)

Chris Canal
sumber
Akankah Resharper benar-benar menghapus referensi ke DLL di folder Referensi? Saya tidak berpikir itu melakukan ini?
tobinharris
1
Saya tidak berpikir itu akan ... Saya pikir itu hanya menarik pernyataan menggunakan namespace Anda tidak referensi. FWIW - Coderush menawarkan fungsi yang sama "dan banyak lagi!" :)
Samurai Ken
1
Sekarang ~ 4 tahun terakhir ReSharper 6.1 mendapatkan fitur tersebut!
Julien Roncaglia
3

Saya melakukan ini tanpa ekstensi di VS 2010 Ultimate Architecture-> Generate Dependency Graph-> By Assembly, ini menunjukkan rakitan yang digunakan, dan secara manual menghapus referensi yang tidak digunakan.

mes
sumber
Saya tidak merekomendasikan ini untuk proyek yang lebih besar. Saya merasa sangat sulit untuk membedakan apa yang digunakan dan apa yang tidak. Saya juga kebetulan buta warna, jadi kemungkinan itu mempengaruhi kegunaan ini bagi saya.
DubiousPusher
2

Saya memiliki jawaban gratis yang berfungsi di semua versi Visual Studio dan versi Framework apa pun. Itu tidak menghapus referensi yang tidak digunakan, tetapi mengidentifikasi mereka.

Anda dapat menggunakan Telerik JustDecompile pada dll proyek Anda. Buka saja dll di JustDecompile dan masuk Referenceske bawah untuk melihat apa yang sebenarnya digunakan dalam dll yang telah dikompilasi.

masukkan deskripsi gambar di sini

toddmo
sumber
1
Saya pikir itu solusi yang bagus! Apakah Anda menulis plugin VS? :) ILSpy memiliki sebuah plugin, dan saya akan melihat apakah itu dapat dengan mudah semi-otomatis entah bagaimana ...
Steven Coco
@StevenCoco Saya sudah lama tidak melakukannya tetapi API IDE cukup mudah dengan banyak contoh bagus di internet. Semoga berhasil dan perbarui kami dengan proyek Anda jika Anda menyelesaikannya!
toddmo
0

Mengingat bahwa VisualStudio (atau apakah itu msbuild?) Mendeteksi referensi yang tidak digunakan dan tidak menyertakannya dalam file output, Anda dapat menulis skrip yang mengurai referensi keluar dari csproj, dan membandingkannya dengan Assemblies yang direferensikan yang dideteksi oleh refleksi pada keluaran proyek.

Jika Anda termotivasi ...

Benjol
sumber
1
Ini tidak selalu benar. Misalnya, jika Anda memiliki kelas Foo yang diturunkan dari Bar, dan Anda memiliki anggota statis Blah di Bar, dan Anda menyebutnya Foo.Blah, maka Anda harus memiliki perakitan Foo dalam referensi untuk kompilator, tetapi tidak akan dipancarkan menjadi keluaran, karena anggota statis ada di Bar. Ada beberapa kasus lagi seperti ini.
Ilya Ryzhenkov
Ya, saya telah memperhatikan beberapa 'lubang' di skrip saya, tidak pernah sempat memikirkan mengapa. Terimakasih atas infonya.
Benjol
0

Saya pikir itu disalin di bin \, karena dalam proyek yang menghapus referensi memiliki referensi o proyek lain yang memiliki referensi yang sama ...

hdmq
sumber
0

Jika Anda mengetahui referensi mana yang tidak digunakan, Anda dapat menghapusnya secara manual.
Di penjelajah solusi, klik kanan referensi di node referensi , dan kemudian klik Hapus.

lemak
sumber