1

Shared Source Common Language InfrastructureMethodImplOptions Enumeration を認識しています。.NET ランタイムの実装方法について詳しく知りたいと思っています。

たとえば、次の質問に対する彼の回答です。Hans Passant は、Math.Pow() が C++ でどのように実装されているかについて、clr/src/vm/ecall.cpp: How is Math.Pow() implemented in .NET Framework? で語っています。. 私の質問は、そもそもそのファイルを調べる方法をどのように知っていますか? コードをよく知っているからですか、それともどこかにリファレンスがありますか? つまり、Math.Pow() が ecall.cpp に実装されていることを示すリファレンス

4

1 に答える 1

4

まあ、SSCLI のソースをいじることができます。しかし、それはあなたが求めていたものではないと思います:-)

ただし、プレーンの誤検知を絞り込むことはできますfindstr /s /i "pow" *.*

クラスを逆コンパイル (または、必要に応じて逆アセンブル) することから始めますSystem.Math。あなたが知らなかった場合に備えてmscorlib.dllMSDNが教えてくれます。

そうすれば、メソッドに実際に本体が定義されているのではなく、署名だけが定義されていることがわかります。ただし、MethodImplAttribute割り当てられています。の値を持っていますMethodImplOptions.InternalCall繰り返しますが、 MSDN を見ると、この方法は

「呼び出しは内部 的です。つまり、共通言語ランタイム内に実装されているメソッドを呼び出します。」(強調を追加)。

これにより、1 つの重要なヒントが得られるはずです。CLR 自体を実装するために使用される言語であるため、C または C++ に似た言語で実装されている可能性があります。

それを知った上で、SSCLI のすべての C++ ソース ファイルを検索します。

findstr /s /i "pow" *.cpp

これにより、ヒット曲はかなり絞り込まれますが、それでも多くのものがあります。検索で大文字と小文字を区別し、単語全体のみを検索する (「power」などを除外する) など、実際に実験する時が来ていることを認識してください。

findstr /s /r "\<Pow\>" *.cpp

これを行うと、この例では 2 つのヒットのみが返されます。

clr\src\classlibnative\float\comfloat.cpp:FCIMPL2_VV(double, COMDouble::Pow, double x, double y)
clr\src\vm\ecall.cpp:    FCFuncElement("Pow", COMDouble::Pow)

出力はほとんどそれを示しています:Pow何らかの形で に関連しているようCOMDouble::Powです。

InterallCall率直に言って、 / instrinct 関数 (または必要に応じてルックアップ テーブル) が で見つかるという知識をどのように思いついたかは覚えていませんがclr\src\vm\ecall.cpp、もう一度必要な場合は上記のようにします。

SSCLIを勉強したことについてのあなたの質問に対するハンスのコメントに付け加えると、一般的に、他のコードベースを読んで探索することは、常に教育的であり、あなたが十分にオタクであれば「面白い」ことさえあると言えます. 特に、それらが現在取り組んでいるテクノロジ ドメインに関連している場合はそうです。多くの人が、BCL やその他の .NET ライブラリについて、逆コンパイルまたはコメント付きの公開ソースを使用して調べていると思います。しかし、CLR 自体も非常に興味深いものであり、SSCLI は多少古くなっています。もう 1 つの興味深い点は、Visual Studio と共にインストールされる CRT (C/C++ ランタイム ライブラリ) ソース (例: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt) です。

于 2013-02-01T12:37:37.637 に答える