Reflectorがなぜこのような重要なユーティリティなのですか?


10

リフレクターを取り巻く問題を読んで、私は製品とその使用法について考えました。多くの人々はそれを必須のツールと考えているようです。

私は認めざるを得ません、私は何年もリフレクターを使用していません。つまり、.Net APIと使用するサードパーティコンポーネントの両方のドキュメントがあります。以前は、同僚がリフレクターをツールベルトから引き抜いたときはいつでも、彼が雑草に向かったという感覚を得ました。

Reflectorに関する情熱をすべて読んでいると、本当に何かが足りないのかと疑問に思うようになります。リフレクターのようなものが非常に頻繁に必要になるので、それを不可欠なツールと考えるのはなぜですか?非常にまれに必要になる場合もありますが、必須のツールと見なすには不十分です。教えてください。


私はこの時代に、Reflectorがそれほど重要なユーティリティではなくなったことを嬉しく思います(はるかに古いバージョンの.NETを使用している場合を除きます)。これで、.NETリファレンスソースにアクセスして、CLRの内部の仕組み、面白いコメントなどを確認できます。たとえば、これは、以下の回答で説明したStringBuilder.Lengthメソッドです。より長い長さを割り当てた場合、スペースではなくnull文字を追加する方法を487行で確認できます。
キラレッサ2018年

回答:


8

ここだ完璧な例 .NETリフレクターがあなたのために答えることができる質問の種類の。

または、SOに投稿して、Reflectorがインストールされている他の人に答えてもらうこともできます。;)


それに関する私の唯一の問題は、そのように使用することが合法ではないということです;)

@ピエール、あなたはどのように考えていますか?他に何もない場合は、これらのreferencesource.microsoft.com/netframework.aspxを
Matthew Whited

ほとんどの先進国では、リバースエンジニアリングコードは合法ではありません。そして、あなたのリンクのようにソースが公開されている場合、それは役に立たない;)

2
@Pierre 303:多くの場合、AFAIKの著作権法には、合法的に使用されているソフトウェアとのインターフェースのためのリバースエンジニアリングが許可されているという例外があります。この回答の例はそのカテゴリのものです。
シャープトゥース

@sharptooth:あなたはそれについていくつかの言及がありますか?私は過去にそのような状況にあり、法律のために先に進むことができませんでした。本当に興味があります。

5

私は2つの異なる問題を解決するために、かなり定期的に(平均して週に1〜2回)リフレクターを使用しています。

  1. 不十分に文書化されたAPI /ライブラリ:これの私のお気に入りの例はSharePointです。私が知っているSharePoint開発のほとんどすべての開発者は、利用可能なドキュメントを補足するためにそれを使用しています。それがなくても、ほとんどの場合はい。しかし、かなり困難だったと思われる場合がいくつかあります。

  2. あいまいなエラーのデバッグ:何かが例外をスローしている理由を解明するのにも役立ちます。例外が発生した場所を確認できる場合は、コールチェーンをトレースして、問題が何であるかを理解できます(ライブラリやバグなどを誤って使用しています)。


SharePoint開発に伴う苦痛についてはかなり耳にし、主にその理由から遠ざかっています。一方、それは需要が高く、十分に補償された専門分野のようです。
c152driver 2011

私は過去18か月間、何度もそれを繰り返してきました(現在の仕事は主にSPです)が、私は大ファンではないと言えるでしょう。苦痛の多くは、おそらくそれをあなたがそれで行うべきではないことをするようにすることと、ドキュメントの一般的な欠如によるものだと思います。確かに需要が高く、あなたが良ければ、報酬は公正以上です。
ケンヘンダーソン

4

リフレクターは、使用する必要のあるサードパーティのアセンブリがあり、ドキュメントが不十分であるか、バグがあり、コードで何が行われているのかを知りたい場合に不可欠です。

確かに、あなたがしなければならないことはコードを難読化することであり、Reflectorは役に立たない(または前回チェックしたときだった)が、それによって過去の多くの時間とフラストレーションを節約できた。

また、(以前のバージョン管理時代に)ソースコードを失ったことはありますが、コンパイルされたコードとReflectorを使用してコードを元に戻すことができました。コメント、変数名などが間違っているため、多くの作業が必要でしたが、役に立ちました。

また、VB.NETなどにコードがあり、C#やReflectorでさまざまな言語に切り替える方法を確認したい場合もあります。


あなたは主な理由にぶつかったようです。おそらく、そのような状況で自分自身を見つけることができなかったとしても、私は幸運だと思います。
c152driver 2011

3

実行時にアセンブリを生成するためにReflection.Emitを使用する場合、Reflectorは、生成されたコードが期待どおりであることを視覚的に確認するための非常に貴重なツールになります。


2

Reflectorは、ドキュメントが間違っている場合に発見するのに役立ちます。.NET 1.1に戻ったときに、CLRのStringBuilderドキュメントにバグが見つかりました。Lengthプロパティのドキュメントはこれを言っています:

指定された長さが現在の長さより大きい場合、このインスタンスの文字列値の終わりはスペースで埋められます。

これを念頭に置いてStringBuilderを使用しようとすると、奇妙な結果が得られました。リフレクターを使ってみましたが、問題がありました。.NET 2.0以降のLengthプロパティのドキュメントには、正しい情報が記載されています。

指定された長さが現在の長さよりも長い場合、現在のStringBuilderオブジェクトの文字列値の終わりには、Unicode NULL文字(U + 0000)が埋め込まれます。

たとえば、メッセージボックスで結果のテキストを表示している場合、これは大きな違いを生む可能性があります。MessageBoxは、最初のnull文字でテキストを切り取ります。

Reflectorを使用すると、このようなことを見つけたり、ドキュメントの内容とは対照的にCLRの実際の動作を確認したり、ドキュメントが答えていない質問に答えたりすることができます。


1
.... NETでDelphiを使用するもう1つの理由。実際に標準ライブラリのソースを取得し、それらを逆コンパイルして実際に何が行われているのかを理解する必要はありません。
メイソンウィーラー


1
@メイソン:@マシューが答えたように、.NETライブラリのソースコードは無料で入手できます。多くの場合、Reflectorは、ソースをダウンロードする手間を省くよりも、このようなものを検査するのに便利です。
Adam Robinson、

@アダム:興味深い。それでも、それは個別のダウンロードとしてのみ入手可能であるという事実は、少なくともある程度、私の見解を裏付けるものであり、入手するのは面倒です。
メイソンウィーラー、

1

ライブラリが何をしているか、どのようにしているかを理解し、ソースコードを見て適切に使用する方が簡単な場合があります。

また、私は単に好奇心が強いので、のぞきたいです。

私がリフレクターを使用するもう1つの一般的な方法は、フレームワーク自体が何かを実装する方法を確認することです。

時々、本当に古いプロジェクトで使用されているライブラリがあり、ソースコードやドキュメントがありません。そのような状況では、リフレクターは非常に貴重です。

また、アセンブリのホットパッチにも使用しました。再構築できないライブラリの内部ビットを微調整し、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.