[From 2.4]C#编译器和程序集链接器(以及一些它们的命令开关)

C#编译器:(用csc命令来使用C#编译器)

程序集链接器(Assembly Linker):(用al命令来使用C#编译器)

除了使用C#编译器,还可以使用”程序集链接器“使用程序AL.exe来创建程序。

1.如果程序集要包含由不同编译器生成的模块(而且这些编译器不支持与C#编译器的/addmodule)。

2.可用AL.exe生成只含资源的程序集,也就是所谓的附属程序集(satellite assembly),它们通常用于本地化。(例子3)

3.能生成EXE文件,或者生成只包含清单(对其他模块中的类型进行描述)的DLL PE文件。(例子4)

C#编译器支持开关:

  1. /t[arget]:exe,/t[arget]:winexe,/t[arget]:appcontainerexe,/t[arget]:library或者/t[arget]:winmdobj.所有这些开关都会造成编译器生成含有清单元数据表的PE文件,这些开关分别生成CUI执行体,GUI执行体,Windows Store执行体,类库或者WINMD库。
  2. 除了这些开关,/t[arget]:module:C#编译器还支持/t[target]:module开关,这个开关指示编译器生成一个不包含清单元数据表的PE文件。这样生成的肯定是一个DLL PE文件。CRL想访问其中的任何类型,必须先将该文件添加到一个程序集中。使用/t:module开关时,C#编译器默认为输出文件使用.netmodule扩展名(例子1)
  3. /addmodule:可通过许多方式将模块添加到程序集,如果用C#编译器生成含清单的PE文件,可以使用/addmodule开关。(例子2)
  4. /r[eference]:客户端代码必须使用XXX.dll编译器开关生成,才能使用XXX.dll的程序集的类型。
  5. /resource(C#编译器独有,相当于al的/embed[resource]):/resource开关将指定的资源文件嵌入最终生辰的程序集PE文件中,并更新ManifestResouceDef表,
  6. /linkresouce(C#编译器独有,相当于al的/link[resource]);/linkresouce开关在ManifestResourceDef和FileDef清单表中添加记录项来引用独立存在的资源文件。

AL.exe(程序集链接器)支持:(C#编译器一些支持的AL.exe也支持)

/embed[resource](AL独有):用AL.exe创建程序集时,可用/embed[resource]开关将文件作为资源添加到程序集。该开关获取任意文件,并将文件内容嵌入最终的PE文件。清单的ManifestResourceDef表会更新以反映新资源的存在。

/link[resource](AL独有):它同样获取包含资源的文件,但只是更新清单的ManifestResource和FileDef表以反映新资源的存在,指出资源包含在程序集的哪个文件中。资源文件不会嵌入程序集PE文件中:相反,它保持独立,而且必须和其他程序集文件一起打包和部署。

/main:AL.exe还会生成一个小的全局函数,名为__EntryPoint._实际没有多大用处,开发人员只需知道有这个开关就可以了。(例子4)

/c[ulture]:text开关指定语言文化。例如“en-US”代表英语文化。

/win32res:指定一个.res文件的路径名。(C#编译器和程序集链接器共有)

/win32icon:指定一个.ico文件的路径名。(C#编译器和程序集链接器共有)

例子1:csc /t:module RUT.cs

上述命令行指示C#编译器创建名为RUT.netmodule的文件。这是一个标准的DLL PE文件,但是,CLR不能单独加载它。

例子2:csc /out:MutiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs

上述命令行指示C#编译器编译FUT.cs来生成MultiFileLibrary.dll。

由于指定了/t:library开关,所以生成的是含有清单元数据表的DLL PE文件,

/addmodule:RUT.netmodule开关告诉编译器RUT.netmodule文件时程序集的一部分,具体的说,/addmodule开关告诉编译器将文件添加到FileDef清单元数据表,并将RUT.netmodule的公开导出类型添加到ExportedTypesDef清单元数据表

例子3:

csc /t:module RUT.cs

csc /t:module FUT.cs

al /out:MultiFileLibrary.dll /t:library

RUT.netmodule FUT.netmodule

这个例子首先创建两个单独的模块即RUT.netmodule和FUT.netmodule。

然后生成第三个文件MultiFileLibrary.dll,它是DLL PE文件(因为使用了/t[arget]:library开关),不包含IL代码,但包含清单元数据表,清单元数据表指出RUT.netmodule和FUT.netmodule是程序集的一部分。最终的程序集由三个文件构成:MultiFileLibrary.dll,RUT.netmodule和FUT.netmodule。程序集链接器不能将多个文件合并成一个文件。

例子4:

csc /t:module /r:MultiFileLibrary.dll Program.cs

al /out:Program.exe /t:exe /main:Program.Main

Program.netmodule

第一行将Program.cs文件生成为Program.netmodule文件。第二行生成包含清单元数据表的Program.exe PE文件。此外,由于使用了/main:Program.Main命令行开关,AL.exe还会生成一个小的全局函数名为__EntryPoint。(这个函数只是调用了一下在Program.netModule文件定义的Program类型中包含Main方法。并没有什么意义,开发者只需要知道由这个开关就可以了。)

原文地址:https://www.cnblogs.com/TheChenLin/p/10190289.html

时间: 2024-10-14 03:09:20

[From 2.4]C#编译器和程序集链接器(以及一些它们的命令开关)的相关文章

解释器编译器区别,链接器作用。

编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的.这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式) 链接器作用: 一个大的程序往往会分为多个源程序文件来编写,因而需要对多个源程序分别进行编译或汇编,来生成多个不同的目标文件(.o文件),这些目标文件包含指令.数据.和其他说明信息

程序集链接器(AL.exe)

AL.exe使用程序可以生成一个EXE文件或者DLL PE文件(其中只包含对其他模块中的类型进行描述的一个清单). 不要在普通的命令行窗口中编译,请先打开C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Visual Studio 2010\Visual Studio Tools路径下的Visual Studio 命令提示(2010),在该窗口中输入命令. 举个简单的例子csc /t:module RUT.cscsc /

1.预处理器,编译器,汇编器和链接器

摘自http://www.cnblogs.com/maomaohhmm/archive/2012/10/28/2743903.html 1.预处理器,编译器,汇编器和链接器 (1).预处理(cpp):预处理器不止一种,而C/C++的预处理器就是其中最低端的一种——词法预处理器,主要是进行文本替换.宏展开.删除注释这类简单工作. gcc -E 选项可以得到预处理后的结果,扩展名为.i: C/C++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于C/C++语句(这也是定

C编译器、链接器、加载器详解

摘自http://blog.csdn.net/zzxian/article/details/16820035 C编译器.链接器.加载器详解 一.概述 C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作系统的启动代码和用到的库文件进行组织形成最终生成可加载.可执行代码的过程. 过程图解如下: 预处理器:将.c 文件转化成 .i文件,使用的gcc命令是

自己动手写编译器、链接器目录结构

自序 8第1章 引言 101.1 Hello World编译过程分析 101.1.1 Hello World程序源文件 101.1.2 词法分析 111.1.3 语法分析 121.1.4 语义分析 131.1.5 链接器 141.2 SCC编译器简介 161.2.1 SCC编译器架构 161.2.2 SCC编译器开发环境 171.2.3 SCC编译器运行环境 18第2章 文法知识 202.1 语言概述 202.2 形式语言 212.2.1 字母表和符号串 212.2.2 文法与语言的形式定义 2

你好,C++(4)2.1.3 我的父亲母亲:编译器和链接器 2.1.4 C++程序执行背后的故事

2.1.3  我的父亲母亲:编译器和链接器 从表面上看,我是由Visual Studio创建的,而实际上,真正负责编译源代码创建生成可执行程序HelloWorld.exe的却是Visual Studio中集成的C++编译器cl.exe和链接器link.exe.他们二老,才是我的亲生爹妈. 为了便于人们的编写.阅读和维护,我们的源文件是使用C++这种人们可以理解的高级程序设计语言编写的.然而,计算机却并不理解这种高级语言,也就无法直接执行高级语言编写而成的源文件.所以,这里就需要一个翻译的工作,将

自己动手写编译器、链接器作者自序

<自己动手写编译器.链接器> 纸上得来终觉浅,绝知此事要躬行. --陆游 编译原理与技术的一整套理论在整个计算机科学领域占有相当重要的地位,学习它对程序设计人员有很大的帮助.我们考究历史会发现那些人人称颂的程序设计大师都是编译领域的高手,像写出BASIC语言的比尔·盖茨,Sun公司的Java之父等,在编译领域都有很深的造诣.曾经在世界首富宝座上稳坐多年的比尔·盖茨也是从给微机编写BASIC语言编译器起家的,也正是这个BASIC编译器为比尔·盖茨和保罗·艾伦的微软帝国奠定了基础.这个编写BASI

C++编译器与链接器工作原理

http://blog.csdn.net/success041000/article/details/6714195 1. 几个概念 1)编译:把源文件中的源代码翻译成机器语言,保存到目标文件中.如果编译通过,就会把CPP转换成OBJ文件. 2)编译单元:根据C++标准,每一个CPP文件就是一个编译单元.每个编译单元之间是相互独立并且互相不可知. 3)目标文件:编译所生成的文件,以机器码的形式包含了编译单元里所有的代码和数据. 还有一些其他信息,如未解决符号表,导出符号表和地址重定向表等.目标文

自己动手写编译器、链接器章节划分

<自己动手写编译器.链接器>预计将于12月由清华大学出版社出版,敬请期待,前一篇博客所提内容绝无虚言.这里向大家提前公开一下本书的章节划分,另外公布一下作者邮箱:[email protected]. 章节划分: 第 1 章 引言 第 2 章 文法知识第 3 章 SC 语言定义 第 4 章 SC 语言词法分析第 5 章 SC 语言语法分析 第 6 章 符号表第 7 章 生成 COFF 目标文件第 8 章 X86 机器语言第 9 章 SCC 语义分析第 10 章 链接器第 11 章 SC 语言程序