【问题标题】:Where does nativeGetUninitializedObject actually exist?原生 GetUninitializedObject 实际存在于哪里?
【发布时间】:2011-02-01 17:58:09
【问题描述】:

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

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

【问题讨论】:

    标签: c# serialization clr native-code


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      来自MSDN:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-14
        • 2014-10-12
        • 2010-09-08
        • 1970-01-01
        • 2016-06-17
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        相关资源
        最近更新 更多