2011-02-01 50 views
3

我對一些序列化的東西很好奇,所以我去了FormatterServices,發現一個名爲nativeGetUninitializedObject的方法,它實際上處理給定類型的初始化(不調用custructor)。 [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]nativeGetUninitializedObject實際存在於哪裏?

我在想:哪裏這個方法真的存在這種方法與extern關鍵字和下面的屬性來修飾? CLR調用什麼代碼來初始化給定類型(不調用構造函數)?

回答

4

此方法實際存在於CLR的本機部分。 MethodImplOptions.InternalCall表示一個被轉發給CLR本地代碼並在那裏實現的調用。

MSDN

指定一個內部調用。內部調用是對公共語言運行時本身實現的方法的調用。

6

該方法存在於CLR中。 JIT編譯器可以訪問CLR中包含所有MethodImplOptions.InternalCall函數地址的表。表中的自己相關的你的問題的部分看起來像這樣在SSCLI20源代碼(CLR/src目錄/ VM/ecall.cpp):

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

要JIT方法調用,它只是查找函數名在該表中生成一個直接的CALL指令,如表中列出的函數地址。非常快速,直接從託管代碼轉換爲CLR內用C++編寫的代碼。

ReflectionSerialization :: GetUninitializedObject()方法位於clr/src/vm/reflectioninvocation.cpp中,它太大而無法在此處發佈。您可以在可下載的SSCLI20源代碼中查看。有一堆錯誤檢查,然後調用一個原始的Allocate()方法來爲對象分配內存。沒有構造函數調用。

相關問題