百科问答小站 logo
百科问答小站 font logo



程序集什么玩意?我知道其表现形式为dll和exe,但是exe不是直接执行的文件吗?而dll只是类库,供exe调用代码? 第1页

  

user avatar   rednaxelafx 网友的相关建议: 
      

题主说的是.NET Assembly(程序集)对吧。知乎没有“.NET”这个标签还真是恼人,只有“Dotnet”标签…

言归正传,.NET Assembly虽然后缀名是.exe和.dll,文件格式确实也跟普通Win32应用程序一样是PE(

Portable Executable

)格式,但其内容不一样。

普通Win32应用的PE文件里,PE格式的代码段里的代码就是程序的主要代码了,是以平台相关的机器码形式存储的;

而对.NET Assembly而言,其代码主体是以MSIL(或者叫CIL)的中间代码形式存储在PE格式的“资源”部分而不是在代码部分;其PE格式的代码段里只包含一小块“桩程序”(stub),负责将程序控制权交给CLR去继续执行该assembly里的MSIL代码。

也就是说,.exe后缀的.NET Assembly的PE格式代码段里其实只有这样一个函数调用:

       _CorExeMain(...)      

.dll后缀的则是:

       _CorDllMain(...)      

通过调用CLR的入口函数把控制权交给CLR。

不过从Windows XP开始,Windows自身的loader能够识别出.NET Assembly,从而直接启动CLR去执行该assembly而不需要执行上面说的stub代码。这stub代码主要是为了兼容更老版本的Windows用的。

放个传送门:

Anatomy of a .NET Assembly



  

相关话题

  工作中只能使用C#的基本语法,根本用不到任何如ASP.NET等成熟.Net技术,个人应该如何提高呢? 
  C#里面将对象实例赋值为null会否加速GC释放资源? 
  为什么没有新的支持底层达到类似C++这种程度,而易用性达到C#的语言出现? 
  C# 秒杀物品,程序如何控制并发? 
  想裸写编译器,除了编译原理外还有那些资料可以参考?应该从什么开始写起?(用c/c++)? 
  软件架构中解耦的意义难道是为了频繁的更换架构? 
  C#中的String.Format()这两种写法那个更好? 
  Java 平台中的 JVM 和 .Net 平台下的 CLR 分别是用什么语言写的? 
  创业公司选择 .NET 技术栈究竟比选 Java/Python 贵多少钱? 
  C#中函数中参数问题? 

前一个讨论
C# 或者 SQL Server 生成的 GUID 有没有可能重复?
下一个讨论
这个人能把自己从A点拉到B点吗?





© 2025-04-01 - tinynew.org. All Rights Reserved.
© 2025-04-01 - tinynew.org. 保留所有权利