C# 在.NET中生成大文件

C# 在.NET中生成大文件,c#,.net,compiler-construction,branch,cil,C#,.net,Compiler Construction,Branch,Cil,我想问一下关于.NET可执行文件的两件事: .NET可执行文件为PE格式。这是否意味着CIL编译器生成的地址来自文件的开头(address+size\u of_headers)?或者这些地址仅在内存中执行映像时使用 是否可以(通过CIL编译器)生成大小大于4GB的可执行文件?如果是,如果编译器必须从文件结尾或分支到超过4GB限制的字节调用方法,它会怎么做 的确,我从未见过任何大于4GB的C#可执行文件,我只是个古玩 我认为您混淆了执行CIL和执行本机代码的工作原理 使用CIL,可执行文件中的代码

我想问一下关于.NET可执行文件的两件事:

  • .NET可执行文件为PE格式。这是否意味着CIL编译器生成的地址来自文件的开头(
    address+size\u of_headers
    )?或者这些地址仅在内存中执行映像时使用

  • 是否可以(通过CIL编译器)生成大小大于4GB的可执行文件?如果是,如果编译器必须从文件结尾或分支到超过4GB限制的字节调用方法,它会怎么做


  • 的确,我从未见过任何大于4GB的C#可执行文件,我只是个古玩

    我认为您混淆了执行CIL和执行本机代码的工作原理

    使用CIL,可执行文件中的代码不会实际执行。通常(使用桌面CLR和不使用ngen)CLR读取CIL并动态生成实际的可执行代码(这就是为什么CLR的这一部分被称为“即时编译器”)

    call
    这样的CIL操作码使用令牌引用方法和其他成员。在生成的本机代码中,这些将被转换为该方法的本机代码地址

    br
    这样的操作码包含相对于下一条CIL指令的偏移量,它们只能在当前方法内跳转。在x86上,它们被编译成像
    jne
    这样的指令,其中包含相对于下一条x86指令的偏移量

    但是方法的元数据在
    MethodDef
    表中进行了描述,该表将该方法的IL流引用为4字节(文件的其他部分也使用RVA)。我认为这意味着可执行文件的大小不能超过4GB


    我试图通过使用Reflection.Emit创建一个大型可执行文件来验证这一点。但是,在有8 GB RAM的系统上,我能做的最好的事情就是装入一个1.5 GB的大文件(由于交换,该文件已经使计算机无法使用)。

    “CIL编译器生成的地址”您在说什么地址?输出代码中放在操作码之后的地址。哪个操作码?每个操作码都有自己的格式。br,br\u s,brture,brtrue\u s操作码OK。假设方法代码大于4GB。CIL将做什么?