.NET应用程序集DLL与EXE工作机制及原理介绍

.NET 中的程序集是什么?

根据 MSDN 的说法,程序集是 .NET Framework 应用程序的构建基块;它们构成了部署的基本单位。简单地说,我们可以说,程序集只不过是一个预编译的 .NET 代码,可以由 CLR(通用语言运行时)运行。

让我们以一个示例来理解上述定义。为了理解这一点,让我们创建一个名称为 MyConsoleApp 的简单控制台应用程序。创建控制台应用程序后,请修改程序类,如下所示。

现在,如果您右键单击项目并单击文件资源管理器中的"打开文件夹",您将发现许多内容(源代码,即 Program.cs 类文件、配置文件(即应用程序、包含 AssemblyInfo.cs 类文件等的属性文件夹),如下图所示。

但是,当您构建应用程序时,它会将整个事情放入单个 EXE 中,如下图所示。您可以在 bin => 调试文件夹下找到此文件。

您可以复制这个程序集,即 MyConsoleApp.exe,并把它放在计算机的任何地方,从那里你可以运行它。

因此,程序集只不过是一个部署单元,或者它是 CLR 可以执行的预编译代码块。为了更好地了解,请看下图。

.NET 框架中的程序集类型

在 .NET 框架中,有两种类型的程序集。它们如下所示:

1.EXE(可执行)

2.DLL(动态链接库)

在 .NET 框架中,当我们编译控制台应用程序或 Windows 应用程序时,它会生成 EXE,而当我们编译类库项目或 ASP.NET Web 应用程序时,它会生成 DLL。In.NET框架中,EXE 和 DLL 都称为程序集。

在 .NET 框架中了解 DLL 和 EXE

上面已经创建了一个控制台应用程序,并且我们已经看到它创建了一个 EXE。让我们看看 DLL 的示例。

为了创建 DLL,让我们将类库项目添加到名称为 MyClassLibrary 的同一解决方案中。

创建类库项目后,默认情况下,它将创建一个名称为 Class1 的类文件, 如下所示。

因此,现在我们的解决方案包含两个项目。一个是控制台应用程序,另一个是类库项目,如下所示。

现在,生成解决方案,您应该在自己的 bin => Debug 文件夹中获得预期中的程序集。现在,你想到的问题是DLL和EXE有什么区别?

.NET 框架中的DLL和EXE有什么区别?

EXE 在其自己的地址空间或自己的内存空间中运行。如果您双击 MyConsoleApp EXE,那么您将获得以下输出。现在,这个程序在它自己的内存空间中耗尽了。

如果不关闭此窗口,再次,如果您双击 MyConsoleApp EXE,它将再次运行,并显示相同的输出。

这是因为现在,两个 EXE 都在自己的内存空间中运行。您需要记住的是 EXE 是一个可执行文件,可以作为应用程序本身运行。

那么来到 DLL,它不能像EXE那样自行运行。这意味着MyClassLibrary. dll不能由自己调用或运行。它需要一个要调用它的消费者。

因此,DLL 在其他内存空间内运行。其他内存空间可以是控制台、窗口应用程序或 Web 应用程序,它们应有自己的内存空间。

例如,可以从控制台应用程序调用 DLL。我们有一个名为 MyConsoleApp 的控制台, 让我们看看如何从这个控制台应用程序调用 MyClassLibrary. dll 。

为了在 MyConsoleApp 中使用 MyclassLibrary. dll, 首先, 您需要引用该Dll。添加对 MyClassLibrary DLL 的引用后,请修改控制台应用程序的程序类,如下所示。

现在,运行应用程序,您应该会看到以下输出。在这里,MyClassLibrary DLL 在 MyConsoleApp 地址空间内运行。

因此,简言之,它们之间的区别在于EXE是一个可执行文件,可以作为应用程序本身运行,

而DLL通常由EXE或其他DLL使用,我们无法直接运行或执行 DLL。

现在,这个问题应该想到为什么我们需要DLL,因为它不是自己调用的。DLL 背后的原因是可再使用性。

假设您在许多应用程序中需要一些类、逻辑或其他内容,然后只需将这些类、逻辑放入DLL中,并在需要的地方引用该DLL。

到此这篇关于.NET应用程序集DLL与EXE工作机制的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 把DLL文件打包进EXE的操作技巧

    废话就不多说了,直接进入主题吧 用VS2005建立一个windows项目,取名test 引用dll文件 编写代码,正常引用dll里的类库, 同时在test项目添加资源文件(该文件就是刚才引用的dll文件) VS2005会自动生成引用代码,我这里引用的是IrisSkin2.dll 复制代码 代码如下: internal static byte[] IrisSkin2 { get { object obj = ResourceManager.GetObject("IrisSkin2", r

  • 使用 JScript 创建 .exe 或 .dll 文件的方法

    什么是 JScript? JScript 是由微软开发的活动脚本语言,基于 ECMAScript 规范实现.Internet Explorer 中的 JavaScript,实际上是指 JScript.JScript 已被 Windows Script Host(WSH)支持(WSH 中的 JavaScript shell scripting:C:\> cscript jslint.js).JScript 最新的版本(JScript.NET)基于 ECMAScript 4.0 ,并且可以在 .Ne

  • c#项目将dll打包到exe中的步骤

    意图: 想将项目用到的两个dll库文件(CryptEnDe.dll和ICSharpCode.SharpZipLib.dll)一同编译进exe中,并编译后仅一个exe程序就可以独立运行不再需要其它文件. 实现: 1.将两个dll库文件作为资源文件添加进项目中: 2.添加功能代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System

  • C#程序(含多个Dll)合并成一个Exe的简单方法

    开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超简单的方法,不用写一行代码就可轻松实现. 这里我们需要用到一款名为Fody.Costura的工具.Fody.Costura是一个Fody框架下的插件,可通过Nuget安装到VS工程中.安装之后,就可以将项目所依赖的DLL(甚至PDB)文件全部打包到EXE文件里. 使用方法 在VS中,通过Nuget为

  • C#(.Net)将非托管dll嵌入exe中的实现

    目录 托管dll与非托管dll 下载与安装 添加Dll 调用 编译 托管dll与非托管dll 托管dll实际上是指C#编写的dll,可以直接右键"引用"导入 而大部分情况下,我们需要引用C++写的dll,如果你的dll是使用 DllImport来导入的,那么它就属于非托管dll,这种dll无法直接嵌入exe中,需要借助工具:Costura.Fody,该工具可以使用VS直接下载 下载与安装 右键引用,选择"管理NuGet程序包",搜索 "fody"

  • .NET应用程序集DLL与EXE工作机制及原理介绍

    .NET 中的程序集是什么? 根据 MSDN 的说法,程序集是 .NET Framework 应用程序的构建基块;它们构成了部署的基本单位.简单地说,我们可以说,程序集只不过是一个预编译的 .NET 代码,可以由 CLR(通用语言运行时)运行. 让我们以一个示例来理解上述定义.为了理解这一点,让我们创建一个名称为 MyConsoleApp 的简单控制台应用程序.创建控制台应用程序后,请修改程序类,如下所示. 现在,如果您右键单击项目并单击文件资源管理器中的"打开文件夹",您将发现许多内

  • token工作机制及原理附Java生成token工具类

    什么是token Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码. 基于 Token 的身份验证使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.流程是这样的:客户端使用用户名跟密码请求登录服务端收到请求,去验证用户名与密码验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端客户端收到 T

  • tomcat中Servlet的工作机制详细介绍

    tomcat中Servlet的工作机制 在研究Servlet在tomcat中的工作机制前必须先看看Servlet规范的一些重要的相关规定,规范提供了一个Servlet接口,接口中包含的重要方法是init.service.destroy等方法,Servlet在初始化时要调用init方法,在销毁时要调用destroy方法,而对客户端请求处理时则调用service方法.对于这些机制的支持都必须由Tomcat内部去支持,具体则是由Wrapper容器提供支持. 在tomcat中消息流的流转机制是通过四个不

  • 详解OpenStack云平台的网络模式及其工作机制

    网络,是OpenStack的部署中最容易出问题的,也是其结构中难以理清的部分.经常收到关于OneStack部署网络方面问题和OpenStack网络结构问题的邮件.下面根据自己的理解,谈一谈OpenStack的虚拟网络.网络拓扑和网络流.个人理解有限,仅抛砖引玉,有问题请指正,谢谢. 一.相关概念和要点(可跳过) 1.OpenStack中nova-network的作用 OpenStack平台中有两种类型的物理节点,控制节点和计算节点.控制节点包括网络控制.调度管理.api服务.存储卷管理.数据库管

  • Session的工作机制详解和安全性问题(PHP实例讲解)

    我们先简单的了解一些http的知识,从而理解该协议的无状态特性.然后,学习一些关于cookie的基本操作.最后,我会一步步阐述如何使用一些简单,高效的方法来提高你的php应用程序的安全性以及稳定行. 我想大多数的php初级程序员一定会认为php默认的session机制的安全性似乎是有一定保障的,事实恰好相反 – php团队只是提供了一套便捷的session的解决方案提供给程序员使用,至于安全性的话,应该由程序员来加强,这是应用程序开发团队的责任.因为,这里面的方法很多,可以这么说吧,没有最好,只

  • Javascript 引擎工作机制详解

    Javascript 引擎工作机制 javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等,这些概念正是JS引擎工作的核心组件.这篇文章的目的不是孤立的为你讲解每一个概念,而是通过一个简单的demo来展开分析,全局讲解JS引擎从定义到执行的每一个细节,以及这些概念在其中所扮演的角色. var x = 1; //定义一个全局变量 x function A

  • Python获取DLL和EXE文件版本号的方法

    本文实例讲述了Python获取DLL和EXE文件版本号的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import win32api def getFileVersion(file_name):     info = win32api.GetFileVersionInfo(file_name, os.sep)     ms = info['FileVersionMS']     ls = info['FileVersionLS']     version = '%d.%d

  • 浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器

    1.iterable iterator区别 要了解两者区别,先要了解一下迭代器协议: 迭代器协议是指:对象需要提供__next__()方法,它返回迭代中的元素,在没有更多元素后,抛出StopIteration异常,终止迭代. 可迭代对象就是:实现了迭代器协议的对象. 协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)通过迭代器协议访问对象,因此,for循环并不需要知道对象具体是什么,只需要知道对象能够实现迭代器协议即可. 迭代器(ite

  • MapTask工作机制图文详解

    MapTask工作机制如图所示.  (1)Read阶段:MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value. (2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value. (3)Collect收集阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果.在该函数内部,它会将生成的key/value分区(调用

  • 浅谈Android IPC机制之Binder的工作机制

    进程和线程的关系 按照操作系统中的描述,线程是CPU调度的最小单位,同时线程也是一种有限的系统资源.而进程一般是指一个执行单元,在pc端或者移动端上是指一个程序或者一个应用.一个进程中可以包含一个或者是多个线程.所以他们的关系应该是包含和被包含的关系. 跨进程的种类 在Android中跨进程通信的方式有很多种,Bundle,文件共享,AIDL,Messenger,ContentProvider,Socket,这些都能实现进程间之间的通信,当然,虽然都能够实现进程间通信,但是他们之间的实现原理或者

随机推荐