2011-02-01 14 views
3

私はFormatterServicesを覗き込んで、nativeGetUninitializedObjectというメソッドが見つかりました。実際には、指定された型の初期化(custructorを呼び出さずに)を処理します。このメソッドは、externキーワードと次の属性で修飾されています。[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]nativeGetUninitializedObjectは実際にどこに存在しますか?

このメソッドは実際にはどこにありますか? CLRは、コンストラクタを呼び出さずに、指定された型を初期化するためにどのようなコードを呼び出しますか?

答えて

4

このメソッドは、実際にはCLRのネイティブ部分に存在します。 MethodImplOptions.InternalCallは、CLRネイティブコードに転送され、そこで実装されたコールを示します。 MSDNから

は内部コールを指定します。内部呼び出しは、共通言語ランタイム自体で実装されているメソッドへの呼び出しです。

6

このメソッドはCLRに存在します。 JITコンパイラは、すべてのMethodImplOptions.InternalCall関数のアドレスを含むCLR内のテーブルにアクセスできます。あなたの質問に関連のあるテーブルのセクションには、SSCLI20のソースコード(CLR/SRC/VM/ecall.cpp)で次のようになります。メソッド呼び出しをJITするに

FCFuncStart(gSerializationFuncs) 
    FCFuncElement("nativeGetSafeUninitializedObject", ReflectionSerialization::GetSafeUninitializedObject) 
    FCFuncElement("nativeGetUninitializedObject", ReflectionSerialization::GetUninitializedObject) 
FCFuncEnd() 

、それは単に、関数名を検索しますこの表にリストされているように関数アドレスへのダイレクトCALL命令を生成します。非常に高速で、マネージコードからCLR内のC++で書かれたコードへの直接遷移。

ReflectionSerialization :: GetUninitializedObject()メソッドは、clr/src/vm/reflectioninvocation.cppの中にありますが、ここに投稿するには大きすぎます。ダウンロード可能なSSCLI20ソースコードを見てください。多くのエラーチェックがあり、オブジェクトのメモリを割り当てるための未処理のAllocate()メソッドの呼び出しがあります。コンストラクタ呼び出しはありません。