ทำไม Reflector ถึงเป็นเครื่องมือที่จำเป็นอย่างยิ่ง?


10

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

ฉันต้องยอมรับว่าฉันไม่ได้ใช้ Reflector มาหลายปีแล้ว ฉันหมายถึงมีเอกสารสำหรับทั้ง. Net API และส่วนประกอบบุคคลที่สามที่ฉันใช้ ในอดีตทุกครั้งที่มีเพื่อนร่วมงานคนหนึ่งดึงตัวสะท้อนแสงออกจากเข็มขัดเครื่องมือของเขาฉันก็รู้สึกว่าเขามุ่งหน้าไปที่วัชพืช

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


ฉันยินดีที่จะบอกว่าในวันนี้และอายุนี้ Reflector ไม่ใช่เครื่องมือที่จำเป็นอีกต่อไป (ยกเว้นว่าคุณใช้. NET เวอร์ชั่นเก่ากว่า) ตอนนี้คุณสามารถเยี่ยมชมแหล่งอ้างอิง. NETและดูการทำงานภายในของ CLR ความคิดเห็นที่น่าขบขันและทั้งหมด ตัวอย่างเช่นนี่คือวิธีStringBuilder.Length ที่ฉันพูดถึงในคำตอบของฉันด้านล่าง คุณสามารถดูได้ในบรรทัด 487 วิธีผนวกอักขระว่างไม่รวมช่องว่างหากคุณกำหนดความยาวที่มากกว่า
Kyralessa

คำตอบ:


8

นี่คือตัวอย่างที่สมบูรณ์แบบของประเภทคำถาม. NET Reflector ที่สามารถตอบคำถามของคุณได้

หรือคุณสามารถโพสต์ไว้บน SO และให้คนอื่นที่ติดตั้ง Reflector ตอบคำถามแทนคุณ ;)


ปัญหาเดียวของฉันคือว่ามันไม่ถูกกฎหมายที่จะใช้มันอย่างนั้น;)

@ เปียโนคุณคิดยังไง? หากไม่มีสิ่งอื่นใดคุณสามารถใช้แหล่งอ้างอิง
สุทธิ netframework.aspx

รหัสวิศวกรรมย้อนกลับไม่ถูกกฎหมายในประเทศที่พัฒนาแล้วส่วนใหญ่ และมันก็ไร้ประโยชน์เมื่อแหล่งที่มาถูกเผยแพร่เช่นในลิงค์ของคุณ;)

2
@Pierre 303: กฎหมายลิขสิทธิ์ของ AFAIK มักจะมีข้อยกเว้นที่ระบุว่าอนุญาตให้ใช้วิศวกรรมย้อนกลับเพื่อการเชื่อมต่อกับซอฟต์แวร์ที่ใช้อย่างถูกกฎหมาย ตัวอย่างในคำตอบนี้มาจากหมวดหมู่นั้น
sharptooth

@sharptooth: คุณมีข้อมูลอ้างอิงเกี่ยวกับเรื่องนี้บ้างไหม? ฉันเคยอยู่ในสถานการณ์เช่นนี้ในอดีตและไม่สามารถไปข้างหน้าได้เนื่องจากกฎหมาย ฉันจะสนใจจริงๆโดยที่

5

ฉันใช้ตัวสะท้อนแสงเป็นประจำ (โดยเฉลี่ยประมาณหนึ่งหรือสองครั้งต่อสัปดาห์) เพื่อช่วยแก้ปัญหาสองประเด็นที่แตกต่างกัน

  1. API / Library ที่มีเอกสารไม่ดี: ตัวอย่างที่ฉันชอบคือ SharePoint นักพัฒนาส่วนใหญ่ทุกคนที่ฉันรู้จักในการพัฒนา SharePoint ใช้เพื่อเสริมเอกสารที่มี เราจะผ่านมันไปได้ไม่โดยส่วนใหญ่ใช่; แต่มีหลายกรณีที่มันจะค่อนข้างยาก

  2. การดีบักข้อผิดพลาดที่คลุมเครือ: นอกจากนี้ยังสามารถเป็นประโยชน์ในการหาสาเหตุที่มีบางอย่างเกิดข้อยกเว้น หากคุณสามารถดูได้ว่ามีข้อยกเว้นใดเกิดขึ้นคุณสามารถติดตามการโทรกลับเพื่อหาว่าปัญหาคืออะไร (ไม่ถูกต้องโดยใช้ไลบรารีข้อบกพร่อง ฯลฯ )


ฉันได้ยินมาบ้างเกี่ยวกับความเจ็บปวดที่เกี่ยวข้องกับการพัฒนาของ SharePoint และอยู่ห่างออกไปเป็นส่วนใหญ่ด้วยเหตุผลดังกล่าว ในทางกลับกันดูเหมือนว่ามีความต้องการสูงและได้รับการชดเชยเป็นพิเศษ
c152driver

ฉันได้ทำมันไปเรื่อย ๆ ในช่วง 18 เดือนที่ผ่านมา (งานปัจจุบันส่วนใหญ่เป็น SP) แต่ฉันสามารถพูดได้ว่าฉันไม่ใช่แฟนตัวยง ฉันคิดว่าความเจ็บปวดมากมายมาจากการทำสิ่งที่คุณไม่ควรทำและขาดเอกสารทั่วไป แน่นอนในความต้องการสูงและถ้าคุณดีชดเชยได้มากกว่ายุติธรรม
Ken Henderson

4

ตัวสะท้อนแสงเป็นสิ่งจำเป็นเมื่อคุณมีชุดประกอบของบุคคลที่สามที่คุณต้องใช้และเป็นเอกสารที่ไม่ดีหรือมีข้อบกพร่องอยู่ภายในและคุณต้องการทราบว่าเกิดอะไรขึ้นกับรหัสของมัน

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

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

นอกจากนี้บางครั้งคุณมีรหัสในการพูด VB.NET และคุณต้องการที่จะดูว่ามันจะทำอย่างไรพูด C # และสะท้อนแสงสามารถสลับระหว่างภาษาต่างๆ


คุณดูเหมือนจะมีเหตุผลสำคัญ บางทีฉันอาจจะคิดว่าตัวเองโชคดีที่ไม่ได้พบตัวเองในสถานการณ์เหล่านั้นบ่อยนัก
c152driver

3

เมื่อใช้ Reflection.Emit เพื่อสร้างแอสเซมบลีที่รันไทม์ Reflector กลายเป็นเครื่องมือที่มีค่าอย่างยิ่งสำหรับการตรวจสอบโค้ดที่สร้างขึ้นด้วยสายตาตามที่คุณคาดหวัง


2

ตัวสะท้อนสัญญาณจะช่วยให้คุณค้นพบเมื่อเอกสารผิด ฉันพบข้อผิดพลาดในเอกสารคู่มือ StringBuilder ของ CLR ย้อนกลับไปใน. NET 1.1 เอกสารสำหรับคุณสมบัติLengthระบุสิ่งนี้:

หากความยาวที่ระบุมีค่ามากกว่าความยาวปัจจุบันจุดสิ้นสุดของค่าสตริงของอินสแตนซ์นี้จะถูกเสริมด้วยช่องว่าง

ฉันพยายามใช้ StringBuilder โดยคำนึงถึงสิ่งนี้และได้ผลลัพธ์ที่แปลกประหลาด ฉันใช้ Reflector และเห็นปัญหา เอกสารสำหรับคุณสมบัติความยาวใน. NET 2.0 ขึ้นไปมีข้อมูลที่ถูกต้อง:

ถ้าความยาวที่ระบุมีค่ามากกว่าความยาวปัจจุบันจุดสิ้นสุดของค่าสตริงของวัตถุ StringBuilder ปัจจุบันจะถูกเติมด้วยอักขระ Unicode NULL (U + 0000)

สิ่งนี้สามารถสร้างความแตกต่างอย่างมากถ้าพูดว่าคุณกำลังแสดงข้อความที่เป็นผลลัพธ์ด้วย MessageBox MessageBox จะตัดข้อความที่อักขระ null ตัวแรก

สะท้อนทำให้มันเป็นไปได้ที่จะหาสิ่งที่ต้องการนี้เพื่อดูวิธีการ CLR จริงๆพฤติกรรมตรงข้ามกับสิ่งที่เอกสารพูดหรือตอบคำถามเอกสารก็ไม่ได้คำตอบ


1
... อีกเหตุผลหนึ่งที่ใช้ Delphi ผ่าน. NET คุณได้รับแหล่งข้อมูลสำหรับไลบรารีมาตรฐานจริง ๆ และไม่ต้องใช้ในการถอดรหัสพวกเขาเพื่อให้เข้าใจว่าพวกเขากำลังทำอะไรอยู่
Mason Wheeler


1
@ Mason: @Matthew ตอบแล้วซอร์สโค้ดสำหรับ. NET library นั้นสามารถใช้ได้อย่างอิสระ ตัวสะท้อนแสงมักจะสะดวกกว่าสำหรับการตรวจสอบสิ่งต่าง ๆ เช่นนี้แทนที่จะต้องยุ่งยากกับการดาวน์โหลดแหล่งข้อมูล
อดัมโรบินสัน

@Adam: น่าสนใจ ถึงกระนั้นความจริงที่ว่ามันมีให้ดาวน์โหลดแยกต่างหากเท่านั้นซึ่งตามที่คุณคิดว่าเป็นเรื่องยุ่งยากที่จะได้รับการเน้นย้ำถึงจุดของฉันในระดับหนึ่งอย่างน้อย
Mason Wheeler

1

บางครั้งมันง่ายกว่าที่จะเข้าใจว่าห้องสมุดกำลังทำอะไรอยู่ทำอย่างไรและใช้งานได้อย่างเหมาะสมโดยดูที่ซอร์สโค้ดของมัน

บางครั้งฉันก็อยากรู้อยากเห็นและต้องการที่จะมอง

วิธีทั่วไปอีกอย่างหนึ่งที่ฉันใช้ Reflector คือดูว่า Framework ทำงานด้วยตัวเองอย่างไร

บางครั้งฉันมีห้องสมุดที่ใช้ในโครงการที่เก่ามากและเราไม่มีซอร์สโค้ดหรือเอกสารประกอบ Reflector ค่อนข้างล้ำค่าในสถานการณ์เหล่านั้น

ฉันยังใช้มันเพื่อประกอบฮอตแพทช์ มีบางกรณีที่ฉันต้องปรับแต่งบิตภายในของไลบรารีที่ฉันไม่สามารถสร้างใหม่และใช้ Reflector เพื่อค้นหาจุดที่เหมาะสมจากนั้นแก้ไข IL ของชุดประกอบ (ไม่ฉันไม่ได้พูดถึงการแตกร้าว แต่ใช้ประโยชน์อย่างถูกกฎหมาย ฟังก์ชั่นนี้)


0

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

ยกตัวอย่าง

เมื่อเร็ว ๆ นี้ฉันต้องสร้างโค้ดบางส่วนที่สามารถรันไทม์สร้างทรีนิพจน์สำหรับสิ่งต่อไปนี้ แต่ไม่ทราบชื่อของคุณสมบัติที่ต้องพึ่งพา ณ เวลารวบรวม

Expression<Func<TMock, TDependency>> expression = (x => x.Dependency);

เพื่อที่จะตั้งค่าการเยาะเย้ยแบบไดนามิก (โดยใช้กรอบงาน Moq)

mock.Setup(expression).Returns(dependency);

สิ่งที่ฉันทำคือฉันรวบรวมนิพจน์ดั้งเดิมโดยใช้รูปแบบที่เป็นรูปธรรมจากนั้นใช้ตัวสะท้อนแสงฉันพบว่าฉันต้องเขียนโค้ดต่อไปนี้:

var argument = Expression.Parameter(typeof(TMock), "x");
var getPropertyExpression = Expression.Property(argument, propertyInfo.Name);
var lambda = Expression.Lambda<Func<TMock, TDependency>>(getPropertyExpression, argument);            
Expression<Func<TMock, TDependency>> expression = lambda;    

ฉันจะสามารถคิดออกใช้ทดลองและข้อผิดพลาด แต่ตัวสะท้อนทำให้มันง่าย


0

เพราะถ้าคุณรู้วิธีใช้งานคุณไม่จำเป็นต้องใช้เอกสารประกอบและ API ส่วนใหญ่ไม่มีเอกสารที่มีความหมายใด ๆ

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