hac*_*sid 3 c# clr serialization 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()
Run Code Online (Sandbox Code Playgroud)
要jit方法调用,它只查找该表中的函数名称,并生成一个直接CALL指令到表中列出的函数地址.从托管代码到CLR内部用C++编写的代码的快速,直接过渡.
ReflectionSerialization :: GetUninitializedObject()方法存在于clr/src/vm/reflectioninvocation.cpp中,它太大了,无法在此处发布.您可以查看可下载的SSCLI20源代码.有一堆错误检查,然后调用原始的Allocate()方法来为对象分配内存.没有构造函数调用.
| 归档时间: |
|
| 查看次数: |
492 次 |
| 最近记录: |