nativeGetUninitializedObject实际存在于哪里?

问题描述:

我对一些序列化的东西很好奇,所以我去了FormatterServices,发现一个名为nativeGetUninitializedObject的方法,它实际上处理给定类型的初始化(不调用custructor)。 [MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]nativeGetUninitializedObject实际存在于哪里?

我在想:哪里这个方法真的存在这种方法与extern关键字和下面的属性来修饰? CLR调用什么代码来初始化给定类型(不调用构造函数)?

此方法实际存在于CLR的本机部分。 MethodImplOptions.InternalCall表示一个被转发给CLR本地代码并在那里实现的调用。

MSDN

指定一个内部调用。内部调用是对公共语言运行时本身实现的方法的调用。

该方法存在于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()方法来为对象分配内存。没有构造函数调用。