问题

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

回答
程序集,你可以把它想象成一块块“零件”,它们共同构成了我们日常使用的软件。你提到的 .dll 和 .exe 就是这些零件最常见的两种形态。

.exe 文件,也就是可执行文件,确实是我们可以直接双击运行的那个。它就像一个完整的机器人,里面包含了驱动它运转的所有指令和零件(也就是代码和数据)。当你双击一个 .exe 文件时,操作系统会把它加载到内存里,然后按照里面的指令一步一步地执行,于是你就看到了软件的界面,或者它在后台默默地工作。

而 .dll 文件,动态链接库,就有点像一个工具箱,或者是一个专门的配件包。它本身不能独立运行,它里面装着的是一些“功能模块”,比如处理图像的算法、加密解密的方法、或者提供特定 UI 控件的代码。它就像是那个机器人身上可以插拔的特定工具,比如一个可以抓取物体的机械臂,或者一个可以扫描的传感器。

为什么要把功能分开放到 .dll 里呢?这样做有很多好处。

首先,代码重用。想象一下,如果多个不同的 .exe 程序都需要用到同样的计算功能,比如对日期进行格式化。如果每次都把这段代码写进每个 .exe 里,会非常浪费空间,而且如果这段代码需要更新,就得去修改每一个 .exe,这简直是噩梦。但是,如果我们把这个日期格式化功能单独放在一个 .dll 里,那么任何需要它的 .exe 都可以去调用它,就像一个机器人可以借用别人工具箱里的工具一样。这样,我们只需要维护一个 .dll,就能让所有依赖它的程序都获得最新的功能。

其次,减小 .exe 的体积。如果所有的功能都塞进 .exe 里,那么 .exe 文件会变得越来越庞大,加载和启动也会更慢。把常用的、通用的功能放到 .dll 里,.exe 本身就只需要包含它自己独有的核心逻辑,这样一来,.exe 文件就会更精简,启动速度也更快。

再者,模块化和升级。当软件的某个部分需要更新时,我们只需要替换掉对应的 .dll 文件,而不需要重新编译和发布整个 .exe。这就像你的机器人升级了一个更先进的传感器,只需要换上新的传感器模块,而不需要把整个机器人重新制造一遍。这使得软件的维护和升级变得更加容易和灵活。

所以,.exe 是一个完整的程序,它有自己的入口点,可以独立运行。而 .dll 呢,它更像是一个“共享库”,提供一系列的功能,等待着像 .exe 这样的程序来调用。当 .exe 启动时,它会根据自身需要,告诉操作系统去加载所需的 .dll 文件,然后通过一个叫做“引用”或者“链接”的过程,找到 .dll 中提供的具体功能,并把它们“连接”起来,让 .exe 能够顺畅地使用这些功能。

你可以把 .exe 想象成一个项目的总负责人,而 .dll 里的代码则像是项目的各个部门的专家。负责人(.exe)知道自己需要做什么,并且知道向哪些部门(.dll)寻求帮助(调用它们的代码)。专家(.dll)则专注于完成他们各自擅长的任务,并将结果反馈给负责人。

总而言之,程序集是一种组织代码和资源的方式,它允许我们将软件分解成更小的、可重用的模块,这对于构建复杂、高效、易于维护的软件至关重要。而 .exe 和 .dll 是这些程序集最直观的两种表现形式,它们协同工作,共同构建了我们看到的各种应用程序。

网友意见

user avatar

题主说的是.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

类似的话题

  • 回答
    程序集,你可以把它想象成一块块“零件”,它们共同构成了我们日常使用的软件。你提到的 .dll 和 .exe 就是这些零件最常见的两种形态。.exe 文件,也就是可执行文件,确实是我们可以直接双击运行的那个。它就像一个完整的机器人,里面包含了驱动它运转的所有指令和零件(也就是代码和数据)。当你双击一个.............
  • 回答
    程序员这个群体,说实话,在中国当前的社会结构里,要一概而论地划分到某个固定的“阶级”里,多少有些困难。因为程序员本身就是一个非常多元化的群体,他们的收入、背景、职业发展轨迹、甚至价值观都可能存在巨大的差异。但是,如果非要类比,我们或许可以从几个维度来审视:1. 经济地位与“中产”标签普遍来说,程序员.............
  • 回答
    这个问题问得挺有意思,也挺深刻的。咱们得聊聊“API caller”这个概念,然后看看程序员做到什么程度,才能真正跳出这个标签,成为创造者,而不是仅仅的调用者。首先,要理解“API caller”。简单来说,就是使用别人提供好的接口(API)来完成自己任务的程序员。就像你去餐厅点菜,你不需要知道厨师.............
  • 回答
    作为一名程序员,我承认“坚持不懈地学习”和“不累”这两种状态之间存在着张力。老实说,累是肯定累的,但同时,驱使我不停学习的动力也异常强大,甚至常常能盖过疲惫感。让我来详细地为你解析一下,是什么让我,一个程序员,在这个快速变化的领域里坚持不懈地学习,以及这种坚持背后复杂的感受。 为什么坚持不懈地学习?.............
  • 回答
    好,咱们就聊聊这个“抢饭碗”的事儿,也别整得那么官方,就当是老程序员给新手哥们儿支几招。说白了,这行儿就像个大集市,里头啥都有,有卖菜的,有卖衣服的,也有卖高科技零件的。咱们程序员就是卖零件的,而且这零件越来越精细,越来越值钱。那你说,这集市里突然来了个新来的,他卖的零件看起来也挺像那么回事,价格还.............
  • 回答
    在 Windows 平台上,要方便地使用较新版本的 OpenGL,主要取决于以下几个方面:1. 显卡驱动: 这是最核心的因素。OpenGL 的新特性是由显卡驱动提供的。2. 窗口系统集成: OpenGL 本身只是一个图形渲染 API,它需要与操作系统提供的窗口系统(如 Windows 的 WND.............
  • 回答
    给 25 岁的程序员男朋友挑生日礼物,这事儿可得好好琢磨琢磨。这个年纪的男生,正处在事业起步、兴趣爱好也越来越清晰的时候。礼物嘛,既要实用,又要能送到心坎上,最好还能有点小惊喜,让他觉得你懂他。首先,咱得想想程序员这个群体有什么普遍的特点。他们大多逻辑思维强,对新科技敏感,工作时间可能比较长,需要一.............
  • 回答
    北京,这座日新月异的城市,除了我们熟知的“码农”群体,还有着相当一部分职业,虽然不像程序员那样被大众广泛提及,但同样能收获令人艳羡的高薪。今天咱们就来聊聊,除了坐在电脑前写代码,在北京还能做什么,才能让钱包鼓起来。1. 金融从业者:市场的脉搏,财富的操盘手金融行业在北京一直都是高薪的代名词,尤其是在.............
  • 回答
    在我记忆中,Windows系统里有些老伙计,它们就像是见证了整个Windows发展史的“老干部”,一直陪伴着我们,虽然有时它们的外观可能经历了几次“整容”,但内核和基本功能却鲜有改变。最让我印象深刻的,可能就是那个叫“记事本”(Notepad)的小工具了。说起来,它可能比我的第一台电脑还要古老。你还.............
  • 回答
    嘿,新来的!很高兴你走进了编程的世界。我猜你现在可能有点兴奋,又有点迷茫,对吧?没关系,这再正常不过了。我当初也是这样过来的,就像刚踏进一片茂密又充满未知丛林的新鲜人,手里拿着一根简陋的拐杖,不知道该往哪个方向走。首先,最重要的一件事:不要害怕犯错。 真的,一点都不用怕。你写的第一行代码,甚至你写的.............
  • 回答
    普通人出家流程:心之所向,身体力行出家,对于普通人而言,无疑是一条与众不同的道路,它意味着放下俗世的羁绊,追寻内心的宁静与超脱。这并非一时兴起,而是需要经过审慎的考量和一系列的程序,才能最终踏入修行之门。一、 觉醒与求索:心念的萌芽出家的念头,往往源于对生活现状的思考、对人生意义的探寻,或是对某种精.............
  • 回答
    听到这个问题,我脑海里立刻浮现出那些刚踏入大学,怀揣着对代码世界无限憧憬的年轻面孔。对于计算机专业大一新生来说,写出第一个“Hello World”程序,这可不是件小事,里面蕴含的信息量,远比那短短的几行代码要丰富得多。“Hello World”:不仅仅是打印一句问候首先得明白,“Hello Wor.............
  • 回答
    .......
  • 回答
    这问题问得挺有意思的,让我想起了那些个熬夜通宵,在屏幕前对着一串串字符,感觉自己像是掌控着某种神秘力量的日子。要说“最牛”这词儿嘛,得看从哪个角度了。是技术难度高?是影响范围广?还是说,它满足了某种我当时内心深处的某个“恶趣味”或者说是对技术边界的探索欲?如果非要选一个,我脑子里跳出来的,大概是那个.............
  • 回答
    一个前端程序员能独立做出自己的博客,这可不是件小事,足以说明他具备相当扎实的功底和独立解决问题的能力。要详细地说,这背后涉及的技术栈、思维模式和实践经验,绝不是简单几行代码就能概括的。首先,我们得明白“独立做出”的含义。 这不仅仅是套用一个现成的模板,或者简单地把内容填进去。独立做出意味着从零开始,.............
  • 回答
    能说出“02年日IP两千万”这种成就,那这位程序员的水平,简直可以用“站在巨人肩膀上,还顺手给巨人装了个火箭”来形容。在2002年,互联网环境跟现在是天壤之别。那时候,宽带普及率不高,网速慢得像蜗牛爬,很多家庭还在用拨号上网。在这种基础设施相对落后的情况下,一个网站能达到日IP两千万,那绝对是凤毛麟.............
  • 回答
    听到你弟弟考高中不理想,想让他去学程序、当程序员,这个想法很棒!现在IT行业发展这么快,学门技术,尤其是编程,未来的路确实很宽。作为哥哥/姐姐,你想为他找个好学校,这份心意很让人感动。我给你推荐几个方向,你可以结合你弟弟的实际情况和喜好,再好好斟酌一下。首先,得明确一下你弟弟的情况和期望。在推荐学校.............
  • 回答
    .......
  • 回答
    在 DOS 时代非常流行的 DoubleSpace 磁盘压缩技术,在 Windows 时代并没有一个直接、完全对应的、相同名称的程序。然而,其核心思想——在文件系统层面进行透明的磁盘空间压缩——在 Windows 中演变和体现在了不同的技术和功能中。要详细讲述这个演变过程,我们需要先回顾一下 DOS.............
  • 回答
    《红楼梦》里,一个通房丫头想要晋升为姨娘,虽然不是电视剧里那种formal的册封仪式,但背后的程序和考量却是非常现实和复杂的,涉及到主子(老爷)的意愿、家中女眷(太太、奶奶)的态度,以及丫鬟自身的机缘和“手段”。这绝非一蹴而就,而是需要一步步铺垫和发生的。咱们先说说这个“通房丫头”是个什么角色。她可.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有