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