Tại sao Reflector là một tiện ích thiết yếu như vậy?


10

Đọc brouhaha xung quanh Reflector sẽ được trả tiền khiến tôi suy nghĩ về sản phẩm và công dụng của nó. Nhiều người dường như coi nó là một công cụ thiết yếu.

Tôi phải thừa nhận, tôi đã không sử dụng Reflector trong nhiều năm. Ý tôi là, có tài liệu cho cả API .Net và các thành phần bên thứ ba tôi sử dụng. Trước đây, bất cứ khi nào một đồng nghiệp kéo Reflector ra khỏi vành đai công cụ của anh ta, tôi có cảm giác anh ta đang đi vào đám cỏ dại.

Đọc tất cả niềm đam mê xung quanh Reflector đang khiến tôi đặt câu hỏi liệu tôi có thực sự thiếu điều gì ở đây không. Tại sao bạn cần một cái gì đó như Reflector thường xuyên đến mức bạn coi nó là một công cụ thiết yếu? Tôi có thể thấy nó cần thiết trong những dịp rất hiếm, nhưng không đủ để được coi là một công cụ thiết yếu. Vui lòng làm sáng tỏ cho tôi.


Tôi rất vui khi nói rằng trong thời đại ngày nay, Reflector không còn là một tiện ích thiết yếu như vậy nữa (trừ khi bạn đang sử dụng các phiên bản .NET cũ hơn nhiều). Bây giờ bạn có thể truy cập Nguồn tham khảo .NET và xem hoạt động bên trong của CLR, tất cả các bình luận thú vị. Ví dụ, đây là phương pháp StringBuilder.Lipse tôi đã nói trong câu trả lời của tôi dưới đây. Bạn có thể thấy trong dòng 487 cách nó nối các ký tự null, không phải khoảng trắng, nếu bạn chỉ định độ dài lớn hơn.
Kyralessa

Câu trả lời:


8

Đây là một ví dụ hoàn hảo về loại câu hỏi .NET Reflector có thể trả lời cho bạn.

Hoặc bạn có thể đăng nó lên SO và để người khác cài đặt Reflector trả lời nó cho bạn. ;)


Vấn đề duy nhất của tôi với điều đó là không hợp pháp khi sử dụng nó như vậy;)

@Pierre, bạn thấy thế nào? Nếu không có gì khác, bạn có thể sử dụng các tài liệu tham khảo
này.microsoft.com/netframework.aspx

Mã kỹ thuật đảo ngược là không hợp pháp ở hầu hết các nước phát triển. Và thật vô ích khi nguồn được xuất bản như trong liên kết của bạn;)

2
@Pierre 303: Luật bản quyền của AFAIK thường có một ngoại lệ nói rằng kỹ thuật đảo ngược nhằm mục đích can thiệp vào phần mềm được sử dụng hợp pháp khác được cho phép. Ví dụ trong câu trả lời này là từ thể loại đó.
sharptooth

@sharptooth: bạn có một số tài liệu tham khảo về điều đó? Tôi đã từng ở trong những tình huống như vậy trong quá khứ và không thể đi trước vì luật pháp. Tôi sẽ thực sự quan tâm bởi điều đó.

5

Tôi sử dụng gương phản xạ trên cơ sở khá thường xuyên (có thể trung bình một hoặc hai lần một tuần) để giúp giải quyết hai vấn đề khác nhau.

  1. API / Thư viện tài liệu kém: Ví dụ yêu thích của tôi cho điều này là SharePoint. Hầu hết mọi nhà phát triển mà tôi biết khi thực hiện phát triển SharePoint đều sử dụng nó để bổ sung cho tài liệu có sẵn. Chúng ta có thể có được mà không có nó, đối với hầu hết các phần có; nhưng đã có một số trường hợp là nó sẽ khá khó khăn.

  2. Gỡ lỗi một lỗi tối nghĩa: Nó cũng có thể hữu ích trong việc tìm ra lý do tại sao một cái gì đó đang ném một ngoại lệ. Nếu bạn có thể thấy trường hợp ngoại lệ xảy ra, bạn có thể tìm ra chuỗi cuộc gọi để tìm ra vấn đề là gì (sử dụng sai thư viện, lỗi, v.v.).


Tôi đã nghe khá nhiều về nỗi đau liên quan đến phát triển SharePoint và đã tránh xa chủ yếu vì lý do đó. Mặt khác, nó có vẻ như là một nhu cầu cao và đặc sản được bù đắp tốt.
c52do

Tôi đã làm điều đó trong 18 tháng qua (công việc hiện tại chủ yếu là SP) nhưng tôi có thể nói tôi không phải là một người hâm mộ lớn. Tôi nghĩ rằng rất nhiều nỗi đau là từ việc khiến nó làm những việc mà có lẽ bạn không nên làm trong đó và chỉ thiếu tài liệu chung. Chắc chắn là có nhu cầu cao và nếu bạn tốt thì việc đền bù sẽ công bằng hơn.
Ken Henderson

4

Reflector là điều cần thiết khi bạn có một số hội đồng bên thứ ba mà bạn phải sử dụng và nó có tài liệu kém hoặc có lỗi trong đó và bạn muốn biết điều gì đang xảy ra với mã của nó.

Chắc chắn, tất cả những gì bạn phải làm là làm xáo trộn mã của bạn và Reflector là vô dụng (hoặc đó là lần cuối tôi kiểm tra) nhưng nó đã giúp tôi tiết kiệm rất nhiều thời gian và thất vọng trong quá khứ.

Ngoài ra, tôi đã có ít nhất một lần tôi bị mất mã nguồn (trong kỷ nguyên kiểm soát phiên bản trước) nhưng đã có mã được biên dịch và Reflector giúp tôi lấy lại mã. Cần rất nhiều công việc vì ý kiến, tên biến, vv là sai nhưng nó đã giúp.

Ngoài ra, đôi khi bạn có mã, nói, VB.NET và bạn muốn xem nó sẽ được thực hiện như thế nào, giả sử, C # và Reflector có thể chuyển đổi giữa các ngôn ngữ khác nhau.


Bạn dường như đã đánh vào những lý do chính. Có lẽ tôi nên xem xét bản thân mình may mắn vì đã không thấy mình trong những tình huống đó rất thường xuyên, nếu có.
c52do

3

Khi sử dụng Reflection.Emit để tạo các cụm khi chạy, Reflector trở thành một công cụ cực kỳ có giá trị để xác minh trực quan mã được tạo như bạn mong đợi.


2

Reflector giúp bạn khám phá khi tài liệu sai. Tôi đã tìm thấy một lỗi trong tài liệu StringBuilder của CLR trong .NET 1.1. Các tài liệu cho thuộc tính Độ dài cho biết điều này:

Nếu độ dài được chỉ định lớn hơn độ dài hiện tại, phần cuối của giá trị chuỗi của thể hiện này được đệm bằng khoảng trắng.

Tôi đã cố gắng sử dụng StringBuilder với ý nghĩ này và nhận được kết quả kỳ lạ. Tôi đã sử dụng Reflector, và thấy vấn đề. Tài liệu về thuộc tính Độ dài trong .NET 2.0 trở đi có thông tin chính xác:

Nếu độ dài được chỉ định lớn hơn độ dài hiện tại, phần cuối của giá trị chuỗi của đối tượng StringBuilder hiện tại được đệm bằng ký tự Unicode NULL (U + 0000).

Điều này có thể tạo ra sự khác biệt lớn nếu, giả sử, bạn đang hiển thị văn bản kết quả với MessageBox; MessageBox cắt văn bản ở ký tự null đầu tiên.

Reflector cho phép tìm ra những thứ như thế này, để xem CLR thực sự hành xử như thế nào , trái ngược với những gì tài liệu nói, hoặc trả lời các câu hỏi mà tài liệu không trả lời.


1
... còn một lý do khác để sử dụng Delphi trên .NET. Bạn thực sự có được nguồn cho các thư viện tiêu chuẩn và không cần phải dịch ngược chúng để tìm ra những gì họ thực sự đang làm.
Mason Wheeler


1
@Mason: Như @Matthew đã trả lời, mã nguồn cho thư viện .NET là miễn phí. Reflector thường thuận tiện hơn cho việc kiểm tra những thứ như thế này, thay vì phải trải qua những rắc rối khi tải nguồn.
Adam Robinson

@Adam: Thú vị. Tuy nhiên, thực tế là nó chỉ có sẵn dưới dạng một bản tải xuống riêng biệt, mà theo bạn là một rắc rối để có được, nhấn mạnh quan điểm của tôi, ở một mức độ nhất định ít nhất.
Mason Wheeler

1

Đôi khi đơn giản hơn để hiểu thư viện đang làm gì, làm thế nào và sử dụng nó một cách thích hợp bằng cách xem mã nguồn của nó.

Những lần khác, tôi chỉ đơn giản là tò mò và muốn nhìn trộm.

Một cách phổ biến khác mà tôi sử dụng Reflector là để xem cách bản thân Framework thực hiện một cái gì đó.

Thỉnh thoảng, tôi có một thư viện đang được sử dụng trong một dự án thực sự cũ và chúng tôi không có bất kỳ mã nguồn hoặc tài liệu nào. Reflector là khá vô giá trong những tình huống.

Tôi cũng đã sử dụng nó để lắp ráp các bản vá nóng. Đã có một vài trường hợp tôi cần phải chỉnh một chút nội bộ của thư viện Tôi không thể xây dựng lại và sử dụng Reflector để tìm điểm thích hợp và sau đó sửa đổi IL của hội đồng (không, tôi không nói về việc bẻ khóa, nhưng sử dụng hợp pháp chức năng này).


0

Tôi sẽ không nói rằng đó là điều cần thiết. Nhưng trong những trường hợp hiếm hoi mà bạn thực sự cần nó, nó rất hữu ích.

Lấy một ví dụ.

Gần đây tôi đã phải tạo một số đoạn mã có thể chạy thời gian tạo cây biểu thức cho các mục sau, nhưng không biết tên của thuộc tính phụ thuộc vào thời gian biên dịch:

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

Để tự động thiết lập một bản giả (sử dụng khung Moq).

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

Những gì tôi đã làm là tôi đã biên dịch biểu thức ban đầu bằng cách sử dụng các loại cụ thể, sau đó sử dụng phản xạ, tôi phát hiện ra rằng tôi phải viết đoạn mã sau:

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;    

Tôi đã có thể tìm ra điều này bằng cách sử dụng thử và lỗi. Nhưng phản xạ làm cho nó dễ dàng.


0

Bởi vì nếu bạn biết cách sử dụng nó, bạn không cần tài liệu - và hầu hết các API không có bất kỳ tài liệu có ý nghĩa nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.