C#中间语言及ILDASM工具用法

当我们编译 .NET 应用程序时会发生什么?

当我们编译任何 .NET 应用程序时,它将生成一个程序集,该扩展项可以是 。DLL 或 。Exe。

例如,如果编译窗口或控制台应用程序,则将得到 .EXE,而如果编译 Web 或类库项目,则会得到 .DLL。

不管它是否是 .DLL 或 .EXE,一个程序集由两个事物组成(清单语言和中间语言)。

了解C#中的中间语言

为了理解 C# 中的中间语言,下面创建一个简单的控制台应用程序。如下所示。

现在,构建应用程序。生成应用程序后,将编译上述源代码,生成中间语言并打包到程序集中。

要查看程序集,只需右键单击"项目"并选择"文件资源管理器中的打开文件夹"选项,然后转到 bin => 调试文件夹,您应该会看到具有 .exe 扩展名的程序集,如下所示,因为它是控制台应用程序。

如何查看 C# 中的中间语言代码?

.NET 框架提供了一个名为 ILDASM(中间语言肢解)的漂亮工具来查看中间语言的代码。要使用 ILDASM 工具,您需要按照以下步骤操作。

在管理员模式下打开可视工作室命令提示符,如下所示。

打开视觉工作室命令提示符后,键入"Ildasm.exe C:\您的目录路径\您的组装.exe"命令并按 enter。

在这里,您需要提供生成 exe 的 exe 路径。我的exe在路径"C:\Users\zhouh\source\repos\ILDASDemo\ILDASDemo\bin\Debug\ILDASDemo.exe"中生成,所以我在命令提示符中执行以下代码:

输入以上命令并按下Enter后, 将打开以下 ILDASM 窗口。

如您所看到的,程序集由两个事物(清单语言和中间语言)组成。让我们先讨论中间语言代码,然后讨论什么是清单。

现在,让我们扩展 ILDASDemo 并将其与代码进行比较。为了更好的理解,请看下图。

ILDASM 中存在一个构造函数,这是因为默认情况下,当类中没有构造函数时,.NET Framework 会提供默认构造函数。

现在,单击 ILDASM 窗口中的主方法以查看为 Main 方法生成的中间语言,如下所示。

什么是清单?

清单包含有关程序集的元数据,如程序集的名称、程序集的版本号、区域性和强名称信息,如下图所示。

元数据还包含有关引用程序集的信息。每个引用包括从属程序集的名称、程序集元数据(版本、区域性、操作系统等)和公钥(如果程序集是强名称)。

如何更改程序集信息?

还可以使用属性更改或修改程序集清单中某些信息。例如,如果要修改版本号,则需要执行以下步骤。

打开AssemblyInfo.cs"属性"文件夹下显示的类文件,如下所示。.NET 中的每个项目都有一个属性文件夹。

如何将中间语言代码导出到文本文件?

从ILDASM 工具中选择文件菜单选项,然后选择转储,您将看到"转储选项窗口",然后单击"转储选项窗口"上的"确定"按钮,如下所示。

点击确定后,会让指定一个保存路径和填入你需要保存的名称, 最终保存il文件结尾的文件。当使用记事本打开,那么将应该看到程序集元数据和 IL 代码。

如何从包含清单和 IL 的文本文件重新生成程序集?

如果要从 IL 代码重建程序集,则需要使用名为 ILASM.exe 的工具, 如下所示, 输入ILASM.exe 空格+ il文件的地址

按下Enter键之后, 中间语言汇编器将把我们的il代码重新构建成程序集,并且在指定的路径生成exe文件。 如下所示:

因此,我们使用ILASM.exe(中间语言汇编器)从包含清单和 IL 的文本文件重建程序集。

到此这篇关于C#中间语言及ILDASM工具用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 如何用C#实现SAGA分布式事务

    目录 背景 成功的 SAGA 异常的 SAGA 子事务屏障 写在最后 背景 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 ACID ,只能够通过分布式事务来解决. 市面上使用比较多的分布式事务框架,支持 SAGA 的,大部分都是 JAVA 为主的,没有提供 C# 的对接方式,或者是对接难度大,一定程度上让人望而却步. 下面就基于这个框架来实践一下银行转账的例子. 前置工作 dotnet add packa

  • 详解C#如何实现读写ini文件

    目录 1.创建一个C#项目 3.创建一个winform界面 4.添加一个ini管理类 5.添加winform代码 1.创建一个C#项目 2.创建一个ini文件 在Debug目录下创建一个ini文件,写入下面内容,注意编码格式用ANSI. [Information] Name=周星星 Gender=男 Age=55 Region=香港 3.创建一个winform界面 如下图 4.添加一个ini管理类 using System; using System.Collections.Generic; u

  • C#实现NPOI的Excel导出详解

    技术点: 1.自定义attribute属性 2.通过反射取类及其属性的attribute属性值 3.NPOI包常用属性及方法(我也仅仅知道用到过的,陌生的要么见名知意,要么百度查) 实现功能点: List类对象的模板导出,实用场景例子见最后代码块(emm...还是比较抽象,代码见) EXCEL导出类DTO超类 定义继承导出类DTO的特性说明类 Excel帮助类 这部分要讲的点其实挺多的,关键就是EXCEL导出所用到的数据源是强类型的. 可以看出来list其实是EF的Queryable toLis

  • C#实现串口调试工具

    前文 由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个RtsEnable设置, 折腾半天, 网上各种版本的也很多, 功能扩展的很开也多.所以现在自己做了一个够用版,基于自己的需求,简单的实现发送接收功能, 至于那些扩展功能可以自己根据需求添加. 正文 先上个运行效果图: 项目架构 该实例用的GalaSoft.Mvvm, 该插件可以直接在NuGet中并且添加. 1.串口参数 , 为了方便, 端口号并没有用动态加载的方式, 如下枚举结构: namespace S

  • C#8.0中的索引与范围功能介绍

    C#8.0中, 新增了一个索引与范围的功能, 为访问序列中的单个元素或范围提供了一种简洁的语法. 在没有提供索引功能之前, 我们需要访问序列中的某个元素, 我们可以利用下标或者部分函数进行获取元素的数据, 如:获取数组中最后一个元素: string[] arr = new string[] { "冰晶凤凰", "影流之主", "德玛西亚", "艾瑞利亚", "寒冰射手" }; var str1 = arr.

  • C#中ManualResetEvent实现线程的暂停与恢复

    目录 背景 ManualResetEvent介绍 实现设计 背景 前些天遇到一个需求,在没有第三方源码的情况下,刷新一个第三方UI,并且拦截到其ajax请求的返回结果.当结果为AVALIABLE的时候,停止刷新并语音提示,否则继续刷新. 分析这个需求,发现需要控制一个刷新循环的暂停与开始,因此网上搜到了通过ManualResetEvent实现线程的暂停与恢复. ManualResetEvent介绍 ManualResetEvent是一个通过信号机制,实现线程间状态同步的类.常用的方法有以下三个:

  • 关于C#中GUI编程的标准事件问题

    前言 昨天的文章,带大家简单学习C#中的事件,了解订阅者和发布者之间的逻辑关联,也通过小案例进行实际操作,可以看到具体的输出结果. 目前在工作中,使用Winform桌面开发比较多,很多时候就会用到事件,此时这里的事件用法有一个俗称叫GUI编程. 在程序运行时,它可以在任何时候被打断,比如按钮点击,按下按键或系统定时器.在这些情况发生时,程序需要处理事件然后继续其他事情. 在Windows GUI编程中经常会用到程序事件的异步处理. 什么是GUI中的标准事件 这种程序事件.NET框架提供一个标准模

  • C#实现单例模式的多种方式

    什么是单例模式? 这里我就不做过多的解释了, 毕竟关于Singleton的资料实在是太多太多了.点击这里 简单的思路就是, 创建对象单例的动作转移到另外的行为上面, 利用一个行为去创建对象自身, 如下: public class Singleton { private Sington() { } private static Singleton _Singleton = null; public static Singleton CreateInstance() { if (_Singleton

  • C#反射调用拓展类方法实例代码

    目录 C# 类拓展方法 C#反射调用拓展类 总结 今天封装Protobuf封包时候遇到一个问题: Protobuf的反序列化方法MergeFrom,是写在扩展类里的:c#拓展类 C# 类拓展方法 要求: 扩展方法类必须为静态类: 拓展方法必须为静态方法,参数为this+需拓展类对象: 多个类拓展方法可以写在一个拓展类中: public class TestExtension { public string Test1() { return "test"; } } public stat

  • C#中间语言及ILDASM工具用法

    当我们编译 .NET 应用程序时会发生什么? 当我们编译任何 .NET 应用程序时,它将生成一个程序集,该扩展项可以是 .DLL 或 .Exe. 例如,如果编译窗口或控制台应用程序,则将得到 .EXE,而如果编译 Web 或类库项目,则会得到 .DLL. 不管它是否是 .DLL 或 .EXE,一个程序集由两个事物组成(清单语言和中间语言). 了解C#中的中间语言 为了理解 C# 中的中间语言,下面创建一个简单的控制台应用程序.如下所示. 现在,构建应用程序.生成应用程序后,将编译上述源代码,生成

  • R语言及RStudio下载与安装方法

    现如今,R语言是统计领域广泛使用的工具,是属于GNU系统的一个自由.免费.源代码开放的软件,是用于统计计算和统计绘图的优秀工具.而RStudio是R的集成开发环境,用它进行R编程的学习和实践会更加轻松和方便.下面就教大家如何下载并安装R和RStudio,比较简单.R的维护工作由一个国际化的开发者团队负责.R软件的官方下载页面叫作The Comprehensive R Archive Network,即CRAN. 一.官网下载R安装包 下载地址为:https://cran.r-project.or

  • Go语言中append函数用法分析

    本文实例分析了Go语言中append函数用法.分享给大家供大家参考.具体如下: Go语言中append的功能十分强大,使用它可以使很多功能的实现变得更加简洁.以下为简单对比: .将一个slice插入到另一个slice的指定位置: 不使用append: 复制代码 代码如下: func insertSliceAtIndex(slice_origin []int, slice_to_insert []int,      insertIndex int) (result []int, err error

  • go语言中if语句用法实例

    本文实例讲述了go语言中if语句用法.分享给大家供大家参考.具体分析如下: if 语句看起来跟 C 或者 Java 中的一样,除了没有了 ( ) 之外(甚至强制不能使用它们),而 { } 是必须的. 复制代码 代码如下: package main import (     "fmt"     "math" ) func sqrt(x float64) string {     if x < 0 {         return sqrt(-x) + "

  • Go语言中Select语句用法实例

    本文实例讲述了Go语言中Select语句用法.分享给大家供大家参考.具体分析如下: select 语句使得一个 goroutine 在多个通讯操作上等待. select 会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支.当多个都准备好的时候,会随机选择一个. 复制代码 代码如下: package main import "fmt" func fibonacci(c, quit chan int) {         x, y := 1, 1         for {

  • Go语言中的switch用法实例分析

    本文实例讲述了Go语言中的switch用法.分享给大家供大家参考.具体分析如下: 这里你可能已经猜到 switch 可能的形式了. case 体会自动终止,除非用 fallthrough 语句作为结尾. 复制代码 代码如下: package main import (  "fmt"  "runtime" ) func main() {  fmt.Print("Go runs on ")  switch os := runtime.GOOS; os

  • Go语言中的range用法实例分析

    本文实例讲述了Go语言中的range用法.分享给大家供大家参考.具体如下: for 循环的 range 格式可以对 slice 或者 map 进行迭代循环. 复制代码 代码如下: package main import "fmt" var pow = []int{1, 2, 4, 8, 16, 32, 64, 128} func main() {     for i, v := range pow {         fmt.Printf("2**%d = %d\n"

  • Go语言中slice的用法实例分析

    本文实例讲述了Go语言中slice的用法.分享给大家供大家参考.具体如下: slice 指向数组的值,并且同时包含了长度信息. []T 是一个元素类型为 T 的 slice. 复制代码 代码如下: package main import "fmt" func main() {  p := []int{2, 3, 5, 7, 11, 13}  fmt.Println("p ==", p)  for i := 0; i < len(p); i++ {   fmt.

  • go语言中linkname的用法

    在go语言的源码中,会发现很多,代码只有函数签名,却看不到函数体,如: // src/os/proc.go 68行 func runtime_beforeExit() // implemented in runtime 此处我们只看到函数签名,却看不到函数体,全局搜了一把,发现它的函数体却定义在src/runtime/proc.go中 // os_beforeExit is called from os.Exit(0). //go:linkname os_beforeExit os.runtim

  • Windows上node.js的多版本管理工具用法实例分析

    本文实例讲述了Windows上node.js的多版本管理工具用法.分享给大家供大家参考,具体如下: 在Linux上我一直使用nvm来管理nodejs的不同版本,但是nvm没有windows版本,今天发现在windows上可以使用另外一个版本管理工具nvm-windows来管理. 下载与安装 下载地址:https://github.com/coreybutler/nvm-windows/releases 安装前,这里有一点需要注意,如果以前安装过node,需要先卸载,并且要把目录清理干净.下面是官

随机推荐