c# - 原生 GetUninitializedObject 实际上存在于何处?

标签 c# serialization clr native-code

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

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

最佳答案

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

关于c# - 原生 GetUninitializedObject 实际上存在于何处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4866179/

相关文章:

c# - 在 C# 中将任意类型实例写入 MemoryStream

c# - 为什么 CLR 不编译溢出 const 而编译变量呢?

c# - 用 C++ 托管 CLR 运行时

c# - 如何向 lambda 表达式添加条件

c# - CustomWebViewRenderer DownloadManager 与 CopyBackForwardList 的问题

c# - HtmlAgilityPack 和大型 HTML 文档

.net - 将NaN值序列化为JSON.NET中的空值作为JSON

java - 序列化 - readObject writeObject 覆盖

c# - C#/.Net 网络浏览器是否容易受到攻击?

c# - 带有可选文本限定符的批量插入