4

シリアル化に関するものに興味があったので、調べてみると、特定のタイプの初期化を(custructorを呼び出さずに)実際に処理するFormatterServicesというメソッドが見つかりました。このメソッドは、キーワードと次の属性nativeGetUninitializedObjectで装飾されています。extern[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]

私は疑問に思っています:このメソッドは実際にどこに存在しますか?(コンストラクターを呼び出さずに)指定された型を初期化するためにCLRはどのコードを呼び出しますか?

4

2 に答える 2

6

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

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

メソッド呼び出しを実行するには、そのテーブルで関数名を検索し、テーブルにリストされている関数アドレスへの直接CALL命令を生成するだけです。マネージコードからCLR内のC++で記述されたコードへの非常に高速で直接的な移行。

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

于 2011-02-01T18:18:53.920 に答える
5

このメソッドは、実際にはCLRのネイティブ部分に存在します。はMethodImplOptions.InternalCall、CLRネイティブコードに転送され、そこで実装される呼び出しを意味します。

MSDNから:

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

于 2011-02-01T18:03:16.600 に答える