nativeGetUninitializedObject实际存在于何处?

时间:2011-02-01 17:58:10

标签: c# serialization clr native-code

我对一些序列化的东西很好奇所以我去了FormatterServices并发现了一个名为nativeGetUninitializedObject的方法,它实际上处理了给定类型的初始化(不调用custructor)。此方法使用extern关键字和以下属性进行修饰:[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]

我想知道:这种方法实际存在于何处? CLR调用什么代码来初始化给定类型(不调用构造函数)?

2 个答案:

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

答案 1 :(得分:4)

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

来自MSDN

  

指定内部呼叫。内部调用是对在公共语言运行库本身内实现的方法的调用。