.NET由三部分组成,执行环境称为公共语言运行库CLR
(Common Language Runtime)、编程工具涵盖了编码和调试需要的一切、基类库BCL
(Base Class Library)。
严格来说.NET由CLR和FCL(框架类库)组成,不包括工具。FCL是BCL的超集,还包括Windows Forms、ASP .NET、LINQ以及更多命名空间
CLR管理:
■ 内存管理和垃圾收集(GC)
■ 代码安全验证
■ 代码执行、线程管理、异常处理
编程工具包括:
■ Visual Studio集成开发环境(IDE)
■ .NET兼容的编译器(C#、Visual Basic .NET、F#、IronRuby和托管的C++等)
■ 调试器
■ 网站开发服务端技术,如ASP .NET和WCF
在VS新建项目模板中,选择类库。编辑完成代码后生成dll文件。
namespace SuperLib
{
public class SquareWidget
{
public double SideLength = 0;
public double Area
{
get{return SideLength * SideLength;}
}
}
}
在解决方案管理器(Solution Explorer)中,右键依赖项(Reference)目录,选择添加引用(Add Reference)。浏览已生成的程序集的dll文件,点击确定。
它必须总是被引用,所以VS不把它显示在Reference中,实际上引用类库如下:
命名空间是共享命名空间名的一组类和类型。
完全限定名:包括命名空间名、分隔点以及类名的完整字符串,称为类的完全限定名。
命名空间名可以是任何有效标识符,且可以包含句点符号。
命名空间声明可以嵌套,但是嵌套的命名空间B并不是A的子集,B的成员不属于A,命名空间是独立的。
命名空间可以跨文件扩展。同一命名空间下,声明在分离的源文件中的类,可以被编译成单一的程序集,也可以被编译成分离的程序集。
必须放在源文件的顶端(但是在#define和#undef后)。
使用了using语句,可在使用命名空间限定类时省略编写命名空间名加句点符号。
using可以指定别名给命名空间,或命名空间内的一个类型。
using 命名空间名;
using 别名 = 命名空间名; //指定命名空间的别名,需要使用别名.类型名的形式,不能省略别名.
using 别名 = 命名空间名.类型名;
程序集本身并不包含本地机器代码,而是公共中间语言代码,还包含实时编译器(JIT)在运行时转换CIL到本机代码所需的一切,包括它引用的程序集的引用。
程序集的扩展名通常为.exe
或.dll
大部分程序集由一个单独的文件组成。包含4个主要部分:清单、类型元数据、CIL代码、资源。
程序集代码文件成为模块。对于有多个模块的程序集,一个文件是主模块,其他是次要模块。
程序集标识符由四个部分组成,共同唯一标识了一个程序集:
MajorVersion.MinorVersion.Build.Revision
。如2.0.35.9。强命名程序集有一个唯一的数字签名依附于它,更加安全。无强名称的程序集称为若命名程序集。
强名称唯一标识了程序集,没有CLR安全组件来捕获更改,强命名程序集的内容不能被改变。
强命名程序集默认只能访问其他强命名程序集。
强名称由编译器产生,而不是程序员。编译器产生强名称,接受关于程序集的信息,并散列化这些信息以创建一个唯一的数据签名依附到该程序集。在散列处理中使用:
■ 组成程序集的字节序列
■ 简单名称
■ 版本号
■ 文化信息
■ 公钥/私钥对
使用VS强命名一个程序集,必须有一份公钥/私钥对文件的副本。
步骤:
右键点击解决方案管理器的当前程序集,选择【属性】打开属性设置。
选择【签名】,勾选【为程序集签名】,在选择下拉框内点击【新建】创建新的密钥文件,选择【浏览】选取已存在的密钥文件。
■ 也可以使用Strong Name工具生成
所需dll文件在同一文件下,程序就能良好工作。这称为复制文件(XCopy)部署。该程序集称为私有程序集。
私有程序集所在目录称为应用程序目录。没有必要在注册表中注册组件。
.NET有一个称为全局程序集缓存(GAC)的贮藏库,放进GAC的程序集被称为共享程序集。共享程序集能被系统中其他程序集共享。
只有强命名程序集能被添加到GAC。
GAC位于Windows系统目录的子目录中,.NET4.0以前位于Windows\Assembly中,4.0后位于Windows\Microsoft.NET\assembly中。
安装程序集到GAC,CLR的安全组件会先检验数字签名是否有效,若无数字签名,或无效,则不安装。只检查一次。
使用gacutil.exe
命令行工具可以从GAC中添加或删除程序集,列出GAC包含的程序集。
3个常用指令:
GAC内可能存在许多不同的程序集,他们的文件名相同,但是版本号或公钥等不同成了不同的程序集(标识符不一致)。导致不同的应用程序在同一时间很容易使用不同版本的同一DLL,这称为并肩执行(side-by-side Execution)
配置文件含有关于应用程序的信息,共CLR在运行时使用。可以用于指定CLR使用一个不同版本的DLL,或搜索程序引用的DLL时在附加目录中查找。
配置文件由XML代码组成,不包含C#代码。
配置文件放在应用程序目录中。
在延迟签名中,编译器只使用公钥/私钥对中的公钥,公钥可以被放在完成的程序集标识符清单中。
延迟签名使用一个为0的块保留数字签名的位置。
创建延迟签名:
①创建一个密钥文件的副本,它只有公钥
②为程序集范围内的源代码添加一个名称为DelaySignAttribute
的附加特性,并设置为true
。
延迟签名的程序集不是强命名的,不允许直接部署到GAC。
要部署延迟签名的程序集,必须首先使用命令行取消针对这个程序记得GAC签名确认,并允许它被装在GAC中,在VS命令提示中输入:
sn -vr MyAssembly.dll