ลบการอ้างอิงที่ไม่ได้ใช้ (! =“ using”)


100

ฉันจะค้นหาและลบข้อมูลอ้างอิงที่ไม่ได้ใช้ในโครงการของฉันได้อย่างไร

ฉันรู้ว่าคุณสามารถลบคำสั่งที่ใช้ในปี 2008 ได้อย่างง่ายดาย แต่ไม่ได้ลบการอ้างอิงจริงในโครงการของคุณ dll ที่อ้างอิงจะยังคงถูกคัดลอกใน bin / แพ็คเกจการตั้งค่าของคุณ


ขอบคุณ. น่าเศร้าที่ไม่มีคำตอบที่ฉันกำลังมองหา ...
Boris Callens

คำตอบ:


55

* หมายเหตุ: โปรดดูhttp://www.jetbrains.net/devnet/message/5244658สำหรับคำตอบนี้ในเวอร์ชันอื่น

เมื่ออ่านกระทู้ดูเหมือนว่าจะมีความสับสนกับคำถามเดิม ให้ฉันแทงมัน

โพสต์ต้นฉบับกำลังถามคำถาม: "ฉันจะระบุและลบการอ้างอิงจากโปรเจ็กต์ Visual Studio หนึ่งไปยังโปรเจ็กต์ / แอสเซมบลีอื่น ๆ ที่ไม่ได้ใช้งานได้อย่างไร" ผู้โพสต์ต้องการให้แอสเซมบลีไม่ปรากฏเป็นส่วนหนึ่งของเอาต์พุตบิลด์อีกต่อไป

ในกรณีนี้ ReSharper สามารถช่วยคุณระบุได้ แต่คุณต้องลบออกด้วยตัวเอง

ในการดำเนินการนี้ให้เปิดหน้าต่างอ้างอิงโซลูชันในเบราว์เซอร์คลิกขวาที่ชุดประกอบที่อ้างอิงแต่ละชุดแล้วเลือก "ค้นหารหัสอ้างอิง" ดู:

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

คุณจะได้รับ:

  1. รายการการอ้างอิงในการอ้างอิงนั้นในหน้าต่างเบราว์เซอร์หรือ

  2. กล่องโต้ตอบแจ้งให้คุณทราบ "ไม่พบรหัสที่ขึ้นอยู่กับโมดูล XXXXXXX"

หากคุณได้รับผลลัพธ์ที่สองคุณสามารถคลิกเมาส์ขวาที่การอ้างอิงเลือกลบและลบออกจากโครงการของคุณ

ในขณะที่คุณต้อง "ด้วยตนเอง" เช่นการอ้างอิงครั้งละหนึ่งครั้งก็จะได้งานทำ หากใครทำสิ่งนี้โดยอัตโนมัติในบางลักษณะฉันสนใจที่จะได้ยินว่ามันทำอย่างไร

คุณสามารถเพิกเฉยต่อสิ่งที่อยู่ใน. Net Framework ได้เนื่องจากโดยปกติจะไม่ถูกคัดลอกไปยังเอาต์พุตการสร้างของคุณ (โดยทั่วไป - แม้ว่าจะไม่จำเป็นสำหรับแอป Silverlight ก็ตาม)

บางโพสต์ดูเหมือนจะตอบคำถาม: "ฉันจะลบโดยใช้อนุประโยค (C #) ออกจากไฟล์ซอร์สโค้ดที่ไม่จำเป็นในการแก้ไขการอ้างอิงใด ๆ ภายในไฟล์นั้นได้อย่างไร"

ในกรณีนี้ ReSharper จะช่วยได้สองสามวิธี:

  1. ระบุคำสั่งที่ไม่ได้ใช้โดยใช้สำหรับคุณในระหว่างการตรวจจับข้อผิดพลาดบนเครื่องบิน จะปรากฏเป็นคำเตือนการตรวจสอบรหัส - รหัสจะปรากฏเป็นสีเทา (เป็นค่าเริ่มต้น) ในไฟล์และ ReSharper จะให้คำแนะนำเพื่อลบออก:

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

  2. ช่วยให้คุณสามารถลบออกโดยอัตโนมัติโดยเป็นส่วนหนึ่งของกระบวนการทำความสะอาดโค้ด:

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

สุดท้ายโปรดทราบว่า ReSharper ทำการวิเคราะห์โค้ดแบบคงที่ในโซลูชันของคุณ ดังนั้นหากคุณมีการอ้างอิงแบบไดนามิกไปยังแอสเซมบลี - พูดผ่านการสะท้อนหรือแอสเซมบลีที่โหลดแบบไดนามิกที่รันไทม์และเข้าถึงผ่านอินเทอร์เฟซ - มันจะไม่รับมัน ไม่มีสิ่งทดแทนสำหรับการทำความเข้าใจฐานรหัสของคุณและการอ้างอิงโครงการเมื่อคุณทำงานในโครงการของคุณ ฉันพบว่าคุณสมบัติ ReSharper มีประโยชน์มาก


คำตอบที่ดีมาก สิ่งที่แปลกคือแม้ว่าคุณจะรู้ว่าฉันไม่ได้อ้างถึงข้อความที่ใช้ (การล้างข้อมูลนั้นเป็นมาตรฐานใน VS แต่อย่าเข้าใจว่าทำไม R # จึงคิดค้นขึ้นมาใหม่) คุณตอบคำถามนั้นก่อน คุณช่วยเปลี่ยนทั้งสองรอบได้ไหม
Boris Callens

จะทำ. คุณลักษณะของ ReSharper มาก่อนการใช้งาน Visual Studio มันยังคงอยู่เหมือนเดิมผ่านคุณสมบัติ "แก้ไขอัตโนมัติ" - แท็กอัจฉริยะจะปิดเมื่อคุณมี ReSharper
jlo

1
ตอนนี้ ~ 4 ปีหลัง ReSharper 6.1 ได้รับคุณสมบัติโดยตรง!
Julien Roncaglia

ไม่แน่ใจว่าคุณหมายถึงอะไร - ReSharper มีคุณสมบัตินี้มาหลายปีแล้ว
jlo

8
ระวัง: หากคุณใช้การสะท้อนแบบใดก็ได้เพื่อโหลดจากแอสเซมบลีแบบไดนามิกสิ่งนี้จะเป็นสิ่งที่ไม่ดี คุณจะใช้ "ข้อมูลอ้างอิง" เพื่อนำชุดประกอบไปยังถังขยะ / ไซต์การผลิต แต่จะไม่มีรหัสอ้างอิงโดยตรง ใช้อย่างใส่ใจ!
Casper Leon Nielsen

12

คุณสามารถใช้ส่วนขยาย" ลบการอ้างอิงที่ไม่ได้ใช้ " ที่ฉันเขียน:

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


ไม่มีการเผยแพร่ส่วนขยายนี้
stombeur

1
ตอนแรกชอบแบบนี้! แต่จากการทดสอบเพิ่มเติมก็ลบการอ้างอิงที่ฉันต้องการออกไป รายละเอียดเพิ่มเติมเกี่ยวกับความล้มเหลวอยู่ที่นี่: wpfsharp.com/2012/04/04/…
Rhyous

7

การลบการอ้างอิงที่ไม่ได้ใช้เป็นคุณลักษณะที่ Visual Studio 2008 รองรับอยู่แล้ว น่าเสียดายสำหรับโครงการ VB .NET เท่านั้น

ฉันได้เปิดคำแนะนำบน Microsoft Connect เพื่อรับคุณลักษณะนี้สำหรับโครงการ C # ด้วย:

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=510326

หากคุณชอบคุณสมบัตินี้เช่นกันคุณอาจโหวตข้อเสนอแนะของฉัน


5

ลองสิ่งนี้: ผู้ช่วยอ้างอิง

สรุป

ผู้ช่วยอ้างอิงช่วยลบการอ้างอิงที่ไม่ได้ใช้ออกจากโครงการ C #, F #, VB.NET หรือ VC ++ / CLI ใน Visual Studio 2010


1
คุณอาจรู้จักส่วนขยายที่คล้ายกันสำหรับ vs 2012?
isxaker

@isxaker ตอนนี้เป็นคุณสมบัติที่สร้างขึ้นใน resharper
itslittlejohn

4

ReSharper 6.1 จะรวมคุณสมบัติเหล่านี้:

  • เพิ่มประสิทธิภาพการอ้างอิง : วิเคราะห์การอ้างอิงแอสเซมบลีของคุณและการใช้งานในโค้ดรับรายการข้อมูลอ้างอิงที่ซ้ำซ้อนและลบออก

  • ลบการอ้างอิงที่ไม่ได้ใช้ : การอ้างอิงอย่างรวดเร็วเพื่อลบการอ้างอิงแอสเซมบลีที่ซ้ำซ้อน

  • การลบอย่างปลอดภัยในการอ้างอิงแอสเซมบลี : จะลบการอ้างอิงแอสเซมบลีหากการอ้างอิงทั้งหมดซ้ำซ้อนมิฉะนั้นจะทำให้การใช้งานไม่ตรงกันและสามารถลบเฉพาะการอ้างอิงแอสเซมบลีที่ซ้ำซ้อนของรายการที่เลือก


4

ReSharperจะทำสิ่งนี้ให้คุณ (และอื่น ๆ อีกมากมาย!)


Resharper จะลบการอ้างอิงไปยัง DLL ในโฟลเดอร์ References หรือไม่ ฉันไม่คิดว่ามันจะทำแบบนี้?
tobinharris

1
ฉันไม่คิดว่ามันจะ ... ฉันคิดว่ามันแค่ดึงคำสั่งใช้สำหรับเนมสเปซที่คุณไม่ได้อ้างอิง FWIW - Coderush มีฟังก์ชันเดียวกัน "และอื่น ๆ อีกมากมาย!" :)
Samurai Ken

1
ตอนนี้ ~ 4 ปีหลัง ReSharper 6.1 ได้รับคุณสมบัติแล้ว!
Julien Roncaglia

3

ฉันทำสิ่งนี้โดยไม่มีส่วนขยายใน VS 2010 Ultimate Architecture-> Generate Dependency Graph-> By Assembly มันแสดงแอสเซมบลีที่ใช้และลบการอ้างอิงที่ไม่ได้ใช้ด้วยตนเอง


ฉันไม่แนะนำสิ่งนี้สำหรับโครงการขนาดใหญ่ ฉันพบว่ามันยากมากที่จะแยกแยะว่าอะไรคืออะไรและไม่ได้ใช้ ฉันเองก็เป็นคนตาบอดสีด้วยเช่นกันซึ่งอาจส่งผลต่อประโยชน์ของสิ่งนี้สำหรับฉัน
DubiousPusher

2

ฉันมีคำตอบฟรีที่ใช้งานได้กับ Visual Studio และ Framework เวอร์ชันใดก็ได้ ไม่ได้ลบการอ้างอิงที่ไม่ได้ใช้ออกไป แต่จะระบุการอ้างอิง

คุณสามารถใช้Telerik JustDecompileบน dll โครงการของคุณ เพียงแค่เปิด dll ใน JustDecompile และเข้าไปด้านล่างReferencesเพื่อดูสิ่งที่ใช้จริงใน dll ที่คอมไพล์แล้ว

ป้อนคำอธิบายภาพที่นี่


1
ฉันคิดว่านั่นเป็นทางออกที่ดีมาก! คุณเขียนปลั๊กอิน VS หรือไม่? :) ILSpy มีปลั๊กอินและฉันจะดูว่ามันเป็นแบบกึ่งอัตโนมัติได้อย่างง่ายดายหรือไม่ ...
Steven Coco

@StevenCoco ฉันไม่ได้อยู่มานาน แต่ IDE api ค่อนข้างตรงไปตรงมาพร้อมตัวอย่างที่ดีมากมายบนอินเทอร์เน็ต ขอให้โชคดีและอัปเดตโครงการของคุณให้เราทราบหากคุณทำสำเร็จ!
Toddmo

0

เนื่องจาก VisualStudio (หรือเป็น msbuild?) ตรวจพบการอ้างอิงที่ไม่ได้ใช้และไม่รวมไว้ในไฟล์เอาต์พุตคุณสามารถเขียนสคริปต์ที่แยกวิเคราะห์การอ้างอิงออกจาก csproj และเปรียบเทียบกับแอสเซมบลีที่อ้างอิงที่ตรวจพบโดยการอ้างอิงบน ผลผลิตของโครงการ

หากคุณมีแรงจูงใจ ...


1
สิ่งนี้ไม่ถูกต้องเสมอไป ตัวอย่างเช่นหากคุณมีคลาส Foo ซึ่งมาจาก Bar และคุณมีสมาชิกแบบคงที่ Blah ใน Bar และคุณเรียกมันว่า Foo.Blah คุณจะต้องมีการประกอบ Foo ในการอ้างอิงสำหรับคอมไพเลอร์ แต่จะไม่ถูกปล่อยออกมา ลงในเอาต์พุตเนื่องจากสมาชิกแบบคงที่อยู่ใน Bar มีบางกรณีเช่นนี้
Ilya Ryzhenkov

ใช่ฉันสังเกตเห็น 'หลุม' บางอย่างในสคริปต์ของฉันไม่เคยคิดเลยว่าทำไม ขอบคุณสำหรับข้อมูล.
Benjol

0

ฉันคิดว่าถูกคัดลอกใน bin \ เนื่องจากในโครงการที่ลบการอ้างอิงมีการอ้างอิง o โครงการอื่น ๆ ที่มีการอ้างอิงเดียวกัน ...


0

หากคุณทราบว่าไม่ได้ใช้การอ้างอิงใดคุณสามารถลบออกได้ด้วยตนเอง
ในโซลูชัน Explorer คลิกขวาที่การอ้างอิงในโหนดการอ้างอิงจากนั้นคลิกเอาออก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.