首页 > 系统相关 >.Net 7 内存模型函数描述结构MethoDesc

.Net 7 内存模型函数描述结构MethoDesc

时间:2023-01-06 10:33:40浏览次数:44  
标签:friend Console 函数 MethoDesc 内存 Net class MethodDesc IL

楔子

讲一些CLR里面的内存模型。本篇MethodDesc,意为函数的描述之意,看下一个函数在CLR里面是如何被描述的。



MethodDesc结构

这个结构体在CLR里面高达1600多行,这里仅截取一些

class MethodDesc
{
    friend class EEClass;
    friend class MethodTableBuilder;
    friend class ArrayClass;
    friend class NDirect;
    friend class MethodDescChunk;
    friend class InstantiatedMethodDesc;
    friend class MethodImpl;
    friend class CheckAsmOffsets;
    friend class ClrDataAccess;
    friend class MethodDescCallSite;

#ifdef _DEBUG
    LPCUTF8         m_pszDebugMethodName;
    LPCUTF8         m_pszDebugClassName;
    LPCUTF8         m_pszDebugMethodSignature;
    PTR_MethodTable m_pDebugMethodTable;
#endif

    PTR_GCCoverageInfo m_GcCover;
    UINT16      m_wFlags3AndTokenRemainder;
    BYTE        m_chunkIndex;
    BYTE        m_bFlags2;
    WORD m_wSlotNumber;
    WORD m_wFlags;
};

这里面可以看到它除了友元类之外,还有一些调试以及非调试的时候所包含的字段。



代码

看下这个简单的例子,在MethodDesc字段里面的表示

    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
            Console::ReadLine()
        }
    }


字段

如上例子所示,Program类,以及Main函数在MethodDesc里面的表示如下


一:

m_pszDebugMethodName = 0x00007ffa973f7dd8 "Main"

0x00007ffa973f7dd8这个地址指向了入口函数Main函数字符串值。

二:

m_pszDebugClassName = 0x00007ffa9739fef0 "ConsoleApp2.Program"

同样是指向字符串

三:

m_pszDebugMethodSignature = 0x00007ffa973f7e28 "void *(string[])"

四:

m_pDebugMethodTable = 0x00007ffa9739ff28 {[Type Name]= "ConsoleApp2.Program" }

可以看到,在IfDebug模式下,类名,函数名,函数的返回值以及参数,以及类的MethodTable都包含在了MethodDesc里面。



示例IL

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  .custom instance void System.Runtime.CompilerServices.NullableContextAttribute::.ctor(uint8) = ( 01 00 01 00 00 ) 
  // 代码大小       19 (0x13)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello, World!"
  IL_0006:  call       void [System.Console]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  call       string [System.Console]System.Console::ReadLine()
  IL_0011:  pop
  IL_0012:  ret
} // end of method Program::Main


解构

注意了这里的MethodDesc主要是指函数描述结构,而非函数体。函数描述结构和用IL代码表达的函数体共同被RyuJIT加载和编译。MethodDesc主要的作用是通过CLR把它传入到RyuJIT,然后对MethodDesc描述的函数进行Native Code编译。



结尾

作者:江湖评谈(公众号同名)
image

标签:friend,Console,函数,MethoDesc,内存,Net,class,MethodDesc,IL
From: https://www.cnblogs.com/tangyanzhi1111/p/17026428.html

相关文章

  • Kubernetes(k8s) kubectl completion常用命令
    kubectl在$HOME/.kube目录中查找一个名为config的配置文件。可以通过设置KUBECONFIG环境变量或设置--kubeconfig参数来指定其它kubeconfig文件。本文主要介绍K......
  • docker network
    dockernetwork1、是什么docker不启动,默认网络情况ens33locirbr0docker启动后,网络情况多了一个docker0查看docker网络模式命令dockernetworkls2、常用基本命令All命令doc......
  • netty中channelHandler实现原理及最佳实践|极客星球
    为持续夯实MobTech袤博科技的数智技术创新能力和技术布道能力,本期极客星球邀请了企业服务研发部工程师梁立从TCP的粘包/半包、Netty处理粘包/半包及源码分析、开源项目......
  • 查看AIX操作系统CPU和内存
    转:https://blog.csdn.net/oradbm/article/details/124565324一、AIX下查看CPU1.查询AIX的硬件信息prtconf 12.查看逻辑CPU个数#pmcycles-m CPU0runsat4204MHz C......
  • asp.netcore Authentication signOut
    .net项目下面的写法会logout:publicclassLogoutController:ControllerBase{publicIActionResultIndex(){returnSignO......
  • php&.net对称压缩解压缩探讨
    C#客户端访问PHPSOAPWebService,当传输大量文本数据时,可以通过压缩减少网络传输。C#在System.IO.Compression命名空间下提供了两个类GZipStream类和DeflateStream类来进行......
  • String 内存地址透析
    publicstaticvoidmain(String[]args){Stringa1=newString("1")+newString("1");a1.intern();Stringb1="11";System.......
  • VB.NET写DXF组码注意事项
    使用VB.NET写DXF组码的时候,需要注意gpcode需要定义为Int16,而不是Integer,应为VB.NET与VB的Integer默认长度是不一样的。另外块参照的组码是INSERT。示例:Dimdatav......
  • 内存注册机使用
    找到正确注册码在程序中出现位置: 中断地址:访问注册码地址的语句地址。中断次数:有些软件在读取正确注册码前也会访问这个地址,在读取注册码时再度使用此地址。这种情况......
  • 阿里云k8s前端测试环境cpu和内存过低pod无法启动的问题
    镜像在本地可以正常启动,放到阿里云之后无法启动,只在容器启动的一瞬间状态是oomkilled的然后无限重启容器,oomkilled状态只维持一会姑没有截图 阿里云edas配置使用cpu和内......