C#程序集系列03,引用多个module
我们经常在项目中引用程序集。通常情况下,一个程序集包含一个module,但一个程序集也可以包含多个module。本篇就来体验:在一个可以被编译成.exe可执行文件的.cs文件中引用多个module。
□ 创建第一个module
→在前面2篇文章中,F盘的as文件夹中存放了若干程序集等文件。
→打开"VS2012开发人员命令提示",输入如下命令,最终清空了F盘的as文件夹中的所有内容
→在F盘的as文件夹中创建MyFirstModule.cs,用记事本打开编写如下代码,并保存
using System;class MyFirstModule{public static void Hello(){Console.WriteLine("来自module 1的问候~");}}
→在"VS2012开发人员命令提示",输入如下命令,把类编译成module,按回车
→输入如下命令,发现F盘的as文件夹中多了一个MyFirstModule.netmodule文件
→输入如下命令,反编译生成的module,把module的IL代码放到1.txt文件中查看,按回车
→输入如下命令,打开1.txt文件
// Metadata version: v4.0.30319.assembly extern mscorlib{.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4...ver 4:0:0:0}.module MyFirstModule.netmodule// MVID: {4403DD3C-6C5D-4AD7-AAD4-2929F36C0F4F}.imagebase 0x10000000.file alignment 0x00000200.stackreserve 0x00100000.subsystem 0x0003 // WINDOWS_CUI.corflags 0x00000001 // ILONLY// Image base: 0x00440000// =============== CLASS MEMBERS DECLARATION ===================.class private auto ansi beforefieldinit MyFirstModuleextends [mscorlib]System.Object{.method public hidebysig static void Hello() cil managed{// 代码大小 13 (0xd).maxstack 8IL_0000: nopIL_0001: ldstr bytearray (65 67 EA 81 6D 00 6F 00 64 00 75 00 6C 00 65 00 // eg..m.o.d.u.l.e.20 00 31 00 84 76 EE 95 19 50 7E 00 ) // .1..v...P~.IL_0006: call void [mscorlib]System.Console::WriteLine(string)IL_000b: nopIL_000c: ret} // end of method MyFirstModule::Hello.method public hidebysig specialname rtspecialnameinstance void .ctor() cil managed{// 代码大小 7 (0x7).maxstack 8IL_0000: ldarg.0IL_0001: call instance void [mscorlib]System.Object::.ctor()IL_0006: ret} // end of method MyFirstModule::.ctor} // end of class MyFirstModule
○ .assembly extern mscorlib,说明module用到了外部的mscorlib程序集
○ .module MyFirstModule.netmodule,表示modlue的名称是MyFirstModule.netmodule
○ .class...,表示module中的类
□ 创建第二个module
→在F盘的as文件夹中创建MySecondModule.cs,用记事本打开编写如下代码,并保存
using System;class MySecondModule{public static void Hello(){Console.WriteLine("来自module 2的问候~");}}
→在"VS2012开发人员命令提示",输入如下命令,把类编译成module,按回车
□ 引用多个module
→在F盘的as文件夹中创建MainClass.cs,用记事本打开编写如下代码,并保存
using System;class MainClass{static void Main(){MyFirstModule.Hello();MySecondModule.Hello();}}
→输入如下命令,编译MainClass.cs,并引入2个module
→输入如下命令,运行MainClass.exe
→输入如下命令,反编译MainClass.exe,把它的IL代码呈现到2.txt文件中
→输入如下命令,打开2.txt文件
// Metadata version: v4.0.30319.module extern MyFirstModule.netmodule.module extern MySecondModule.netmodule.assembly extern mscorlib{.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4...ver 4:0:0:0}.assembly MainClass{.custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows..custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ).hash algorithm 0x00008004.ver 0:0:0:0}.file MyFirstModule.netmodule.hash = (2F 9D 95 85 6E F4 D2 CA 50 61 C0 9F A1 58 C6 5F // /...n...Pa...X._5D 1D 96 4B ) // ]..K.file MySecondModule.netmodule.hash = (28 72 47 EE 2E 76 45 AA 6B 87 17 93 6B 4F 1C 5D // (rG..vE.k...kO.]84 D8 07 CB ).module MainClass.exe// MVID: {FD4741CB-DEDE-4D91-9B95-16DAF3CEB47E}.imagebase 0x00400000.file alignment 0x00000200.stackreserve 0x00100000.subsystem 0x0003 // WINDOWS_CUI.corflags 0x00000001 // ILONLY// Image base: 0x003A0000// =============== CLASS MEMBERS DECLARATION ===================.class private auto ansi beforefieldinit MainClassextends [mscorlib]System.Object{.method private hidebysig static void Main() cil managed{.entrypoint// 代码大小 14 (0xe).maxstack 8IL_0000: nopIL_0001: call void [.module MyFirstModule.netmodule]MyFirstModule::Hello()IL_0006: nopIL_0007: call void [.module MySecondModule.netmodule]MySecondModule::Hello()IL_000c: nopIL_000d: ret} // end of method MainClass::Main.method public hidebysig specialname rtspecialnameinstance void .ctor() cil managed{// 代码大小 7 (0x7).maxstack 8IL_0000: ldarg.0IL_0001: call instance void [mscorlib]System.Object::.ctor()IL_0006: ret} // end of method MainClass::.ctor} // end of class MainClass
○ .module extern MyFirstModule.netmodule,引用了MyFirstModule这个module
○ .module extern MySecondModule.netmodule,引用了MySecondModule这个module
○ .assembly extern mscorlib,引用了.NET默认程序集mscorlib
○ .assembly MainClass,代表本程序集
○ .module MainClass.exe,说明MainClass本身包含了一个名称为MainClass.exe的module
○ .class...,表示程序集类
“C#程序集系列”包括:
C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序
C#程序集系列02,使用记事本查看可执行程序集的IL代码
C#程序集系列03,引用多个module
C#程序集系列04,在程序集包含多个module的场景下理解关键字internal
C#程序集系列05,让程序集包含多个module
C#程序集系列06,程序集清单,EXE和DLL的区别
C#程序集系列07,篡改程序集
C#程序集系列08,设置程序集版本
C#程序集系列09,程序集签名
C#程序集系列10,强名称程序集
C#程序集系列11,全局程序集缓存
C#程序集系列12,C#编译器和CLR如何找寻程序集
C#程序集系列13,如何让CLR选择不同版本的程序集
参考资料:
http://www.computersciencevideos.org/ created by Jamie King
C#程序集系列03,引用多个module的更多相关文章
- C#程序集系列05,让程序集包含多个module
本篇体验在一个程序集中包含多个module. □ 创建3个module →删除F盘as文件夹中的一些文件,只剩下如下3个文件→用记事本打开MyFirstModule.cs文件,修改如下,并保存 usi ...
- C#程序集系列04,在程序集包含多个module的场景下理解关键字internal
本篇在一个程序集包含多个module的场景下体验internal的含义. →查看F盘as文件夹下的文件→删除MainClass.exe→把MyFirstModule和MySecondModule组装到 ...
- C#程序集系列13,如何让CLR选择不同版本的程序集
本篇主要体验,在存在多个版本程序集的情况下,如何让CLR选择哪个版本程序集运行,以及程序集版本的切换. 分别生成非强名称程序集不同版本 □ 生成某个版本的程序集 →清理F盘as文件夹,剩下如下文件 → ...
- C#程序集系列12,C#编译器和CLR如何找寻程序集
本篇体验C#编译器和CLR运行时如何查找程序集,并自定义CLR运行时查找程序集的方式. □ C#编译器和CLR运行时如何查找程序集 C#编译器在哪里?--在C:\Windows\Microsoft.N ...
- C#程序集系列11,全局程序集缓存
全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集.当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集. 为什么需要全局程 ...
- C#程序集系列10,强名称程序集
当一个程序集的名称,版本,文化,Public Key都做了设置,就可以把这个程序集叫做"强名称程序集".强名称程序集可以防止被仿冒或篡改.本篇首先创建一个强名称程序集,接着模拟篡改 ...
- C#程序集系列09,程序集签名
在"C#程序集系列08,设置程序集版本"中体验了为程序集设置版本,但对于程序集的安全性来说,还远远不够.本篇体验程序集的签名. □ 程序集的签名 →F盘as文件夹下有多个文件→在程 ...
- C#程序集系列08,设置程序集版本
区别一个程序集,不仅仅是程序集名称,还包括程序集版本.程序集公匙.程序集文化等,本篇体验通过界面和编码设置程序集版本. □ 通过Visual Studio设置程序集版本 →右键项目,选择"属 ...
- C#程序集系列07,篡改程序集
以下几个方面用来区分不同的程序集:○ 程序集名称:Name○ 程序集版本:Version○ 程序集公匙: Public Token○ 程序集文化:Culture 如果没有很严格地按照上面的几个方面来创 ...
随机推荐
- SQL Server 2000 系统存储过程
SQL Server 2000 系统存储过程 在 Microsoft? SQL Server? 中,许多管理和信息活动可以通过系统存储过程执行.系统存储过程按这些分类分组. 分类 描述 Active ...
- 利用Requests库写爬虫
基本Get请求: #-*- coding:utf-8 -*- import requests url = 'http://www.baidu.com' r = requests.get(url) pr ...
- gtk+学习笔记(七)
今天被一个文本框坑了,基本设置什么的都对,但是就是无法显示中文,按钮名称都可以显示中文,先介绍下文本框的基本函数吧. GtkWidget *gtk_text_view_new(void);新建一个文本 ...
- CCF CSP 201409-2 画图
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-2 画图 问题描述 在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y ...
- python 判断字符编码
一般情况下,需要加这个: import sys reload(sys) sys.setdefaultencoding('utf-8') 打开其他文件编码用codecs.open 读 下面的代码读取了文 ...
- ASP.NET Web API 2:Action的返回类型
Web API控制器中的Action方法有如下几种返回类型: void HttpResponseMessage IHttpActionResult 其它类型 基于上面几种不同的返回类型,Web API ...
- 【AtCoder】AGC023 A-F题解
可以说是第一场AGC了,做了三道题之后还有30min,杠了一下D题发现杠不出来,三题滚粗了 rating起步1300+,感觉还是很菜... 只有三题水平显然以后还会疯狂--啊(CF的惨痛经历) 改题的 ...
- Adobe Photoshop CC 2017-18.0安装教程
Adobe Photoshop CC 2017-18.0安装教程 注:下载链接在文章后面 第一步:首先请将电脑的网络断开,很简单:禁用本地连接或者拔掉网线,这样就可以免除登录Creative Clou ...
- GPL、BSD和Apache开源许可证
参考资料 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT) 如何选择开源许可证? - 阮一峰的网络日志 开源许可证教程 - 阮一峰的网络日志 简介 自由软件许可证由FSF(Free ...
- CF687B Remainders Game
题意:已知n个数,第i个为ci,给定一个数x mod ci的结果,再给点一个k,问能不能知道x mod k的值? 分析:刚看题目的我一脸蒙蔽,对题意有点不理解,能的情况似乎有很多,我该从哪里下手呢 ...