1.将源代码编译成托管模块
托管模块是一个标准的 windows可移植可执行(PE)文件。该文件需要CLR才能执行,最终用户必须在字迹的机器上安装CLR。
托管模块的组成部分:PE标头,CLR标头,元数据,中间语言IL代码。
其中,元数据包含两种主要类型的表:描述在源代码中定义的类型和成员的表,描述源代码引用的类型和成员的表。其作用:
1) 元数据在编译时不需要头和库文件。编译器可直接同托管模块中读取元数据
2) 使用编辑器的intellisence功能分析元数据
2. 将托管模块组合为程序集
程序集assembly是一个或多个托管模块或资源文件的逻辑分组。
3. 加载公共语言运行库CLR
可以在System32目录下查找MSCoreEE.dll文件,来判断是否已经安装了.net框架。
4. 执行程序集代码
JIT编译器将IL编译成CPU指令。
CLR提供了一个在OS进程中执行多个托管应用程序的功能,称为AppDomain。
5. 公共语言规范CLS
CLS定义了所有语言必须支持的最小特性集。
在代码中,让编译器检查CLS兼容性
[assembly:CLSCompliant(true)]
6. 非托管代码的互操作性
1) 托管代码可以调用DLL中的非托管函数,基于P/Invoke平台机制
2)托管代码可以使用现有的COM组件
7. 打包部署
1)DLL地狱:当安装一个新的应用程序时,会发现它不知何故损坏了一个已安装的应用程序。
仅仅用文件名区分程序集是不行的,因为两个可能重名,这样后安装的会覆盖掉前面安装的。必须使用强名称程序集。
2) 若要让自己的程序集出现在 添加引用|.net选项卡中,可将下列子键添加到注册表中。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/AssemblyFolders/MyLibName
MyLibName是我创建的名称,使其指向程序集文件的目录路径/MyLibPath
3)程序集版本资源信息
[assembly: AssemblyTitle("WinAppTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("EKING")]
[assembly: AssemblyProduct("WinAppTest")]
[assembly: AssemblyCopyright("版权所有 (C) EKING 2006")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("c27c97d5-2f66-4137-8b39-842b0a4d99c1")]
程序集版本号由四部分组成:主版本,次版本,内部版本号,修订版本号
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
4)部署方式
直接拷贝;生成msi文件;生成cab文件用于internet下载压缩文件
5)控件配置管理
Machine.config
对可执行exe程序:配置文件.exe.config
对web程序:根目录和子目录对应的配置文件Web.config
可以使用 管理工具->Microsoft.net 框架配置
8.共享程序集,全局程序集缓存GAC
1) 强名称程序集
包括4个自定义属性,用以唯一区别程序集:文件名(无扩展名),版本号,区域性标识,公钥标记。如:
Mytypes,Version=1.3.6.1,Culture=neutral,PublicKeyToken=b77a5c561934e089
Mytypes,Version=2.0.3.5,Culture=neutral,PublicKeyToken=b77a5c561934e089
Mytypes,Version=1.3.6.1,Culture=neutral,PublicKeyToken=e03f5648ddfsdfsd59
采用公钥/私钥技术来区分不同公司开发的具有相同自定义属性的程序,公钥标记是公钥64位的 hash 值。
System.Reflection.AssemblyName类,可以方便的获取程序集名的不同部分。
创建 强名称程序集的步骤:
第一步,获取一个密钥: SN -k Mytypes.keys
第二步,应用到源代码中,签名清单:
[assembly: AssemblyKeyFile("Mytypes.keys")]
2) 全局程序集缓存GAC
GAC的目的是存放一个程序集的多个版本。
只有希望程序集被其他许多程序共享时,才建议将程序集部署到GAC中。
如果一个程序集要被多个应用程序访问,程序集必须被放到一个公共目录中,并且当检测到对程序集的引用时,CLR必须自动查找此目录。这个公用位置称为GAC,通常在目录C:/WINNT/assembly中。
安装工具 GACUtil /i