Microsoft .NET框架基本原理

2.生成、打包、部署及管理应用程序与类型

首先得知道CSC.exeC-Sharp Compiler,有了它,就可以直接将代码写在记事本上啦,省去打开VS的烦恼。CSC.exe一般只能从它所在的目录打开它,若想在任何目录下运行它,就必须配置系统环境变量,方法如下:

找到系统环境变量中的Path,双击进行编辑->在原有路径的最后加上分号;”,然后在后面加上你的CSC所在的目录 C:"Windows"Microsoft.NET"Framework"v2.0.50727”,就OK了。

 

下面模拟下书上的例子:将包含各种类型的源代码文件变成一个可部署的文件。

源文件代码如下:

Public class App

{

         Static public void Main(System.String[] args)

{

         System.Console.WriteLine(“Hi”);

}

}

执行命令,如图:

C#编译器产生一个可执行文件App.exe,且产生的文件类型为Win32控制台应用程序。

可以看出代码引用了System.Console类型的WriteLine方法,因此/r:MSCorLib.dll告诉编译器到MSCorLib.dll文件标识的程序集中查找外部类型。

MSCorLib.dll是一个特殊的文件,它包含了.NET框架中所有的核心类型,例如字节、整数、字符、字符串等等。

如输入以下命令:

Nostdlib命令行开关阻止应用MSCorLib.dll,则报错

编译器输出的App.exe是一个标准的PE文件,可以用ILDasm.exeIL反汇编器来查看托管PE文件中的元数据。

程序集是CLR操作的对象,CLR总是先加载包含清单数据表的文件,然后利用该清单来获取程序集中的其他文件。一般情况下,程序集仅包含一个文件,但也可包含多个文件,如一些.gif之类的资源文件和一些带有元数据的PE文件。

因此,程序集可看作是一个逻辑上的EXE或者DLL,理由是程序集允许我们分离可重用类型的逻辑表示和物理表示。

 

下面创建一个多文件程序集:

假设有两个源代码文件,RUT.cs包含很少使用的类型;FUT.cs包含经常使用的类型。

先将很少使用的RUT.cs编译为一个模块:

命令行开关/t:module告诉编译器产生一个不包括清单元素数据表的PE文件,且总是一个DLL文件,其中的类型被外界访问前必须首先添加到一个程序集中。

再将经常使用的FUT.cs编译为一个模块,作为程序清单的保存者。该模块实际上将代表整个程序集。

命令行开关/addmodule:RUT.netmodule告诉编译器把该文件加到FileDef清单元数据表中,并把RUT.netmodule文件中的共有导出类型加入到ExportedTypesDef清单数据表中。

如果将RUT.netmodule文件删除,则在引用JeffTypes.dll文件时会报错。

 

程序集链接器AL.exe,可用于创建包含来自不同编译器生成的模块的程序集。

AL.exe可以产生一个除了清单外不包括任何其他内容的EXE或者DLL PE文件,其中的清单只用于描述其他模块中的类型。

 

私有部署程序集:和应用程序部署在同一个目录下

 

3.共享程序集

强命名程序集有个一发布者的公钥/私钥对,以此对程序集进行唯一的标识。故可进行全局部署,即将程序集部署在一些CLR确知的地方,当CLR搜索程序集时,它会知道到这些地方去寻找。

一个强命名程序集包含有一个文件名,版本号,语言文化标识和一个发布者的私有密钥签名。

 

并存执行:CLR能够将名称相同但路径不同的多个文件加载到同一个地址空间,因此它允许我们创建的新版程序集不必维持向后兼容。

 

 

 

posted on 2009-02-24 00:20  Pavel Yu  阅读(1179)  评论(0编辑  收藏  举报