CLR笔记:2.生成,打包,部署,管理
2009-11-11 18:28
330 查看
2.1 .NET Framework部署目标
非.NET程序的问题:
1.DLL hell
2.安装复杂。目录分散,注册表,快捷方式
3.安全性。悄悄下载恶意代码
2.2 将类型集成到模块中——编译器工具csc
csc /out:Program.exe /t:exe /r:Mscorlib.dll Program.cs
由于C#会自动引用Mscorlib.dll,可以省略 /r:Mscorlib.dll
C#默认生成exe(CUI), 所以/t:exe可以省略;dll(程序集 /t:library)和GUI(可视化应用程序 /t:winexe)时不可以省略
C#默认编译成Program.exe,所以/out:Program.exe可以省略
最后精简为:
csc Program.cs
如果不希望默认引用Mscorlib.dll,使用/nostdlib开关
csc /nostdlib Program.cs
注:/t可以写为/target,/r可以写为/reference
/reference:指定引用的dll,可以使用完整路径;如果是不完整的,在以下目录依次查找:
1.工作目录(要编译的cs文件所在)
2.系统目录(csc.exe所在)
3./lib开关指定的目录
4.LIB系统变量指定的目录
应答文件(Response File)
包括一系列编译器命令行开关,执行csc时会将其打开,例如MyProject.rsp中有以下文本:
/out:Program.exe
/t:exe
/r:Mscorlib.dll
那么调用如下:csc @MyProject.rsp Program.cs
这个应答文件的位置,运行csc命令时,先在当前目录(Program.cs所在)查找;后在系统目录(csc.exe所在)查找,如果都有就以前者为准
使用/noconfig开关指定忽略rsp文件
2.3 元数据概述
3种类别的表:定义表,引用表,清单表
1.常见的定义表:ModuleDef,TypeDef,MethodDef,FieldDef,ParamDef,PropertyDef,EventDef
2.常见的引用表:AssemblyRef,ModuleRef,TypeRef,MemberRef
3.常见的清单表:AssemblyDef,FileDef,ManifestResourceDef,ExportedTypesDef
2.4 合并模块以构成一个程序集
CLR总是首先加载包含清单表的文件,然后使用这个清单,加载其他文件。
使用多文件程序集的3个理由:
1.按类别划分类型,放到不同的程序集中
2.可以添加资源/数据文件,使用AL.exe,使其成为程序集的一部分
3.程序集的各个类型可以使用不同的语言来实现,然后使用ILAsm生成IL
csc /t:module A.cs 指示编译器生成不含清单表的清单文件,一般总是一个DLL,生成的文件为A.netmodule
接下来,要把这个netmodule文件附加到一个有清单表的程序集中,使用addmodule开关:
csc /out:FinalAssmbly.dll /t:library /addmodule:A.netmodule B.cs 这里B.cs包含清单表,最终生成FinalAssmbly.dll,如果A.netmodule不存在,便一起会报错。但是运行程序时,A.netmodule可以不存在,仅在调用其中的方法时,才会加载A.netmodule
VS2005不支持创建多文件程序集。
VS2005中添加引用的“.NET选项”,对应注册表中 HKEY_LOCAL_MACHINESOFTAREMicrosoft.NETFrameworkAssemblyFolders,动态添加键值,VS2005可以在对应的目录下找到dll,并加载到“.NET选项”中。
IL中 Token:0x26000001,000001代表行号,0x26代表FileRef,此外0x01=TypeRef,0x02=TypeDef,0x03=AssemblyRef,0x27=ExportedType。
AL.exe程序集链接器
生成一个DLL,只包括一个清单文件,不包含IL代码,以下生成的是FinalAssmbly.dll:
AL /out:FinalAssmbly.dll /t:library /addmodule:A.netmodule B.netmodule
还可以生成CUI或GUI,但很少这么做,因为要添加/main开关,指定入口方法:
AL /out:FinalAssmbly.dll /t:exe /main:Program.Main /addmodule:A.netmodule B.netmodule
在程序集中包含资源文件,书上讲到了3个开关:
2.5 程序集版本资源信息
使用System.Diagnostics.FileVersionInfo的静态方法GetVersionInfo获取这些信息。在VS2005中,这些信息存放在AsseblyInfo.cs中。
使用AL生成程序集时,可以指定开关,来配置这些信息,表从略(见书)
2.6 语言文化
附属程序集satellite assembly,使用一种具体的语言文化来标记的程序集。
使用AL时,通过/[culture]: text来指定语言文化,这里text为en-US,zh-CN等等。也可以直接写在程序集中,使用自定义属性:
[assembly:AssemblyCulture("en-US")]
使用System.Resource.ResourceManager来访问附属程序集的资源。
2.7 简单应用程序部署
这一节讲的是私有部署方式(private deployed assembly),即部署到和应用程序相同的目录中的程序集
2.8 简单管理控制
CLR定位程序集A时,
对于中性neatual语言文化,按照配置文件privatePath属性顺序,先后扫描privatePath指定的目录,直到找到所需:先找A.dll,如下:
附属程序集遵循同样规则,只是目录变为privatePath+"文化名称(如en-US,先找dll,再找exe;如果没有找到,就把文化名称改为en,重头再来)"
非.NET程序的问题:
1.DLL hell
2.安装复杂。目录分散,注册表,快捷方式
3.安全性。悄悄下载恶意代码
2.2 将类型集成到模块中——编译器工具csc
csc /out:Program.exe /t:exe /r:Mscorlib.dll Program.cs
由于C#会自动引用Mscorlib.dll,可以省略 /r:Mscorlib.dll
C#默认生成exe(CUI), 所以/t:exe可以省略;dll(程序集 /t:library)和GUI(可视化应用程序 /t:winexe)时不可以省略
C#默认编译成Program.exe,所以/out:Program.exe可以省略
最后精简为:
csc Program.cs
如果不希望默认引用Mscorlib.dll,使用/nostdlib开关
csc /nostdlib Program.cs
注:/t可以写为/target,/r可以写为/reference
/reference:指定引用的dll,可以使用完整路径;如果是不完整的,在以下目录依次查找:
1.工作目录(要编译的cs文件所在)
2.系统目录(csc.exe所在)
3./lib开关指定的目录
4.LIB系统变量指定的目录
应答文件(Response File)
包括一系列编译器命令行开关,执行csc时会将其打开,例如MyProject.rsp中有以下文本:
/out:Program.exe
/t:exe
/r:Mscorlib.dll
那么调用如下:csc @MyProject.rsp Program.cs
这个应答文件的位置,运行csc命令时,先在当前目录(Program.cs所在)查找;后在系统目录(csc.exe所在)查找,如果都有就以前者为准
使用/noconfig开关指定忽略rsp文件
2.3 元数据概述
3种类别的表:定义表,引用表,清单表
1.常见的定义表:ModuleDef,TypeDef,MethodDef,FieldDef,ParamDef,PropertyDef,EventDef
2.常见的引用表:AssemblyRef,ModuleRef,TypeRef,MemberRef
3.常见的清单表:AssemblyDef,FileDef,ManifestResourceDef,ExportedTypesDef
2.4 合并模块以构成一个程序集
CLR总是首先加载包含清单表的文件,然后使用这个清单,加载其他文件。
使用多文件程序集的3个理由:
1.按类别划分类型,放到不同的程序集中
2.可以添加资源/数据文件,使用AL.exe,使其成为程序集的一部分
3.程序集的各个类型可以使用不同的语言来实现,然后使用ILAsm生成IL
csc /t:module A.cs 指示编译器生成不含清单表的清单文件,一般总是一个DLL,生成的文件为A.netmodule
接下来,要把这个netmodule文件附加到一个有清单表的程序集中,使用addmodule开关:
csc /out:FinalAssmbly.dll /t:library /addmodule:A.netmodule B.cs 这里B.cs包含清单表,最终生成FinalAssmbly.dll,如果A.netmodule不存在,便一起会报错。但是运行程序时,A.netmodule可以不存在,仅在调用其中的方法时,才会加载A.netmodule
VS2005不支持创建多文件程序集。
VS2005中添加引用的“.NET选项”,对应注册表中 HKEY_LOCAL_MACHINESOFTAREMicrosoft.NETFrameworkAssemblyFolders,动态添加键值,VS2005可以在对应的目录下找到dll,并加载到“.NET选项”中。
IL中 Token:0x26000001,000001代表行号,0x26代表FileRef,此外0x01=TypeRef,0x02=TypeDef,0x03=AssemblyRef,0x27=ExportedType。
AL.exe程序集链接器
生成一个DLL,只包括一个清单文件,不包含IL代码,以下生成的是FinalAssmbly.dll:
AL /out:FinalAssmbly.dll /t:library /addmodule:A.netmodule B.netmodule
还可以生成CUI或GUI,但很少这么做,因为要添加/main开关,指定入口方法:
AL /out:FinalAssmbly.dll /t:exe /main:Program.Main /addmodule:A.netmodule B.netmodule
在程序集中包含资源文件,书上讲到了3个开关:
/embled[resource] 嵌入到程序集中,更新清单表的ManifestResourceDef——对应csc的/resource开关 /link[resource] 并不嵌入到程序集中,更新清单表的ManifestResourceDef和FileDef,对应csc的/linkresource开关 /win32res 嵌入标准的Win32文件 /win32icon 嵌入ico文件
2.5 程序集版本资源信息
使用System.Diagnostics.FileVersionInfo的静态方法GetVersionInfo获取这些信息。在VS2005中,这些信息存放在AsseblyInfo.cs中。
使用AL生成程序集时,可以指定开关,来配置这些信息,表从略(见书)
2.6 语言文化
附属程序集satellite assembly,使用一种具体的语言文化来标记的程序集。
使用AL时,通过/[culture]: text来指定语言文化,这里text为en-US,zh-CN等等。也可以直接写在程序集中,使用自定义属性:
[assembly:AssemblyCulture("en-US")]
使用System.Resource.ResourceManager来访问附属程序集的资源。
2.7 简单应用程序部署
这一节讲的是私有部署方式(private deployed assembly),即部署到和应用程序相同的目录中的程序集
2.8 简单管理控制
CLR定位程序集A时,
对于中性neatual语言文化,按照配置文件privatePath属性顺序,先后扫描privatePath指定的目录,直到找到所需:先找A.dll,如下:
AppDirAsmName.dll AppDirAsmNameAsmName.dll AppDirfirstPrivatePathAsmName.dll AppDirfirstPrivatePathAsmNameAsmName.dll AppDirsecondPrivatePathAsmName.dll AppDirsecondPrivatePathAsmNameAsmName.dll
如果没有,重头再来找A.exe
附属程序集遵循同样规则,只是目录变为privatePath+"文化名称(如en-US,先找dll,再找exe;如果没有找到,就把文化名称改为en,重头再来)"
相关文章推荐
- CLR只记不看笔记(二) 生成、打包、部署和管理应用程序及类型
- CLR笔记:2.生成,打包,部署,管理
- 《CLR via C#》读书笔记 之 生成、打包、部署和管理应用程序及类型
- 《CLR via C#》Part1之Chapter2 生成、打包、部署及管理应用程序及类型(二)
- CLR基础---生成、打包、部署和管理应用程序及类型(二)
- CLR via C# 3 读书笔记(11):第2章 生成、打包、部署和管理应用程序与类型 — 2.3 元数据简介
- CLR基础---生成、打包、部署和管理应用程序及类型(二)
- CLR via C# 3 读书笔记(14):第2章 生成、打包、部署和管理应用程序与类型 — 2.5 程序集版本资源信息
- 生成、打包、部署、及管理应用程序与类型学习笔记
- 《CLR via C#》Part1之Chapter2 生成、打包、部署及管理应用程序及类型
- CLR via C# 3 读书笔记(16):第2章 生成、打包、部署和管理应用程序与类型 — 2.8 简单管理控制(配置)
- CLR via C# 3 读书笔记(10):第2章 生成、打包、部署和管理应用程序与类型 — 2.2 将类型生成为模块
- CLR基础---生成、打包、部署和管理应用程序及类型(一)
- CLR基础---生成、打包、部署和管理应用程序及类型(一)
- CLR via C# 3 读书笔记(15):第2章 生成、打包、部署和管理应用程序与类型 — 2.6 语言文化 & 2.7 简单应用程序部署
- [转载]学习笔记《.NET框架程序设计(修订版)》--第二章 生成、打包、部署及管理应用程序与类型(1)
- CLR via C# 3 读书笔记(13):第2章 生成、打包、部署和管理应用程序与类型 — 2.4 将模块组合为程序集(下)
- CLR via C# 3 读书笔记(12):第2章 生成、打包、部署和管理应用程序与类型 — 2.4 将模块组合为程序集(上)
- 第2章:生成、打包、部署和管理应用程序及类型
- CLR.Via第三版第二章 生成、打包、部署和管理i应用程序及类型(