-> 引用其他程序集
编译器接受源代码文件并生成名称为程序集的输出文件。
这些程序集称为类库,而且它们的程序集文件的名称通常以.dll扩展名结尾而不是.exe扩展名
-> mscrolib库
它就是包含Console类的那个库。Console类被定义在名称为mscrolib的程序集中,在名称为mscrolib.dll的文件里。程序集mscrolib.dll含有C#类型以及大部分.NET语言的基本类型的定义。在编译C#程序时,他必须总是被引用,所以VS不把它显示在Reference目录中。
说明:如果两个程序集中都好有名称相同的类的声明,编译器不知道实例化那一个。
-> 命名空间
命名空间名和命名空间的定义:
-> 你可以把命名空间名视为一个字符串(在字符串中可以使用点),它加在类名或类型名的前面并且通过点进行分割
-> 包括命名空间名、分隔点,以及类名的完整字符串叫做类的完全限定名。
-> 命名空间是共享命名空间的一组类和类型。
-> 你可以使用命名空间来把一组类型组织在一起并且给他们起一个名字。一般而言,命名空间名描述的是命名空间中包含的类型,并且和其他命名空间名不同。
你可以通过在包含你的类型声明的源文件中声明命名空间,从而创建命名空间。
namespace NamespaceName
{
TypeDeclarations
}
创建MyCorp.SuperLib命名空间以及声明其中的SquareWidgate类
namespace MyCorp.SuperLib
{
public clas SquareWidget
{
...
}
}
-> 命名空间名称
命名空间的名称可以包含创建该程序集的公司的名称。除了标识公司以外,该名称还用于帮助程序员获得定义在命名空间内的类型的种类的快速印象。
1、命名空间名称可以是任何有效标识符
2、另外,命名空间名称可以包括句点符号,用于把类型组织成层次。
下面是建议的命名空间命名指南:
1、使用公司名开始命名空间名称
2、在公司名之后跟着技术名称
3、不要把命名空间命名为与类或类型相同的名称。
-> 命名空间的补充
关于命名空间,有其他几个重点应该知道:
1、在命名空间内,每个类型名必须有别与所有其它类型。
2、命名空间内的类型称为命名空间的成员
3、一个源文件可以包含任意数目的命名空间声明,可以顺序也可以嵌套。
SimpleProg.cs 中包含两个namespace
namespace MyNS
{
class FirstClass{...}
class SecondClass{...}
}
namespace OtherNS
{
class FirstClass{...}
class SecondClass{...}
struct MyStruct{...}
}
-> 命名空间跨文件伸展
命名空间不是封闭的。这意味着可以在该源文件的后面或另一个源文件中再次声明它,以对它增加更多的类型声明。
源文件可以被编译成单一的程序集,或编译成分离的程序集
-> 嵌套命名空间
命名空间可以被嵌套,从而产生嵌套的命名空间。嵌套命名空间允许你创建类型的概念层次。
有两种方法声明一个嵌套的命名空间:
1、原文嵌套:
可以把命名空间的声明放在一个封装的命名空间声明体内部,从而创建一个嵌套的命名空间。
namespace MyNamespace
{
class MyClass{...}
namespace Others
{
class OtherClass{...}
}
}
2、分离的声明
也可以为嵌套命名空间创建分离的声明,但必须在声明中使用它的完全限定名称。
namespace MyNamespace
{
class MYClass{...}
}
namespace MyNamespace.OtherNS
{
class OtherClass{...}
}
虽然嵌套命名空间位于父命名空间内部,但是其成员un并不属于包裹的父命名空间。
-> using指令
using命名空间指令和using别名指令
关于using指令词的两个重点:
1、它们必须放在源文件的顶端,在任何类型声明之前
2、它们应用于当前源文件中的所有命名空间
-> using命名空间指令
可以通过在源文件的顶端放置using命名空间指令以避免不得不使用长名称
using命名空间指令通知编译器你将要使用来自某个指令命名空间的类型。然后你可以继续,并使用简单类名而不必全路径修饰它们。
using命名空间指令由关键字using跟着一个命名空间标识符组成。
using System
-> using别名指令
using别名指令允许起一个别名给:
-> 命名空间 using Syst = System;
-> 命名空间内的一个类型 using SC = System.Console;
-> 程序集的结构
程序集不包含本地机器代码,而是公共中间语言代码。他还包含实时编译器(JIT)在运行时转换CIL到本地代码所需的一切,包括对它所引用的其他程序集的引用。程序集的文件扩展名通常为.exe或.dll
大部分程序集由一个单独的文件构成。
-> 程序集的清单包含以下几点:
1、程序集名称标识符
2、组成程序集的文件列表
3、一个指示程序集中内容在哪里的地图
4、关于引用的其他程序集的信息。
-> 类型元数据部分包含该程序集中定义的所有类型的信息,这些信息包含关于每个类型要知道的所有事情。
-> CIL部分包含程序集的所有中间代码
-> 资源部分是可选的,但可以包含图形或语言资源
对于有多个模块的程序集,一个文件是主模块,而其他的是次要模块
1、主模块含有程序集的清单和到次要模块的引用。
2、次要模块的文件名以扩展名.netmodule结尾
3、多文件程序集被视为一个单一单元。它们一期部署并一起定版。
-> 程序集标识符
在.NET框架中,程序集的文件名不像在其他操作系统和环境中那么重要,更重要的是程序集的标识符。
程序集的标识符有4个组成部分,它们一起唯一标识了该程序集。
1、简单名:这只是不带文件扩展名的文件名。每个程序集都有一个简单名。它也被称为程序及名或有好名称
2、版本号:它由4个句点分开的整数字符串组成,例如:2.0.35.9
3、文化信息:它是一个字符串,由2~5分字符组成,代表一种语言,或代表一种语言和一个国家或一个地区
4、公钥:这个128字节字符串应该是生产该程序集的公司唯一的
程序集名称的组成被包含在程序集清单中。
标识符:简单名、版本、文化、公钥共同组成程序集的标识符
完全限定名称:由简单名、版本、文化和表示为16字节公钥凭据的公钥组成的列表文本
显示名称:和完全限定名称相同
-> 强命名程序集
强命名程序集有一个唯一的数字签名依附于它。强命名程序集比没有强名称的程序集更加安全,原因:
1、强名称唯一标识了程序集,没有其他人能创建一个与之有相同名称的程序集,所以用户可以确信该程序集来自于其声称的来源。
2、没有CLR完全组建类捕获更改,带强名称的程序集的内容不能被更改
弱命名程序集是没有被强命名的程序集。由于弱命名程序集没有数字签名,他天生是不安全的。
程序员不产生强名称。编译器产生他,接受关于程序集的信息,并哈希这些信息以创建一个唯一的数据签名依附到该程序集。它在哈希处理中使用的信息如下:
1、组成程序集的字节序列
2、简单名称
3、版本号
4、文化信息
5、公钥/密钥对
创建强命名程序集
要使用VS强命名一个程序集,必须有一份公钥/私钥对文件的赋值。如果没有密钥文件,可以让VS产生一个。可以实行以下步骤:
1、打开工程的属性
2、选择签名页
3、选择为程序集复选框签名并输入密钥文件的位置或创建一个新的。
-> 程序集的私有方式部署
如果应用程序不需要其他程序集,或如果所需的DLL在同意目录下,那么程序应该会就在它所在的地方良好工作。这种方法部署的程序集称为私有程序集,而且这种部署方法称为复制文件部署。
私有程序集几乎可以被放在任何目录中,而且只要它们依赖的文件都在同一目录或子目录中就足够了。事实上,可以在文件系统的不同部分有多个目录,每个目录都有同样的一组程序集,并且它们都会在它们个字不同的位置良好工作。
关于私有程序集不熟的一些重要事情:
1、私有程序集所在的目录被称为应用程序目录
2、私有程序集可以是强命名的也可以使弱命名的
3、没有必要在注册表中注册组件
4、要卸载一个私有程序集,只要从文件系统中删除它即可
-> 共享程序集和GAC(Global Assembly Cache)
私有程序集是非常有用的,但有时你会想把以DLL放在一个中心位置,这样一个单独的复制就能被系统中其他的程序集共享。.NET有这样的贮藏库,称为全局程序集缓存(GAC)。放进GAC的程序集称为共享程序集。
关于GAC的一些重要内容:
1、只有强命名程序集能被添加到GAC。
2、虽然GAC的早期版本只接受带.dll扩展名的文件,现在也可以添加带.exe扩展名的程序集了。
3、GAC位置在名称为Assembly的子目录下,在Windows系统目录中。
-> 把程序集安装到GAC
当试图安装一个程序集到GAC时,CLR的安全组件首先必须检验程序集上的数字签名是否有效。如果没有数据签名,或它是无效的,系统将不会把它安装到GAC。
然而,这是个一次性检查。在程序集已经在GAC内之后,当它被一个正在运行的程序引用时,不再需要进一步的检查。
gacutil.exe命令行工具允许从GAC添加或删除程序集,并列出GAC包含的程序集。它的3个最有用的参数标记:
1、/i:把一个程序集插入GAC
2、/u:从GAC卸载一个程序集
3、/l:列出GAC中的程序集
-> GAC内的并肩执行
在程序集部署到GAC之后,它能被系统中其他程序集使用了。然后,请记住程序集的标识符由完全限定名称的全部4个部分组成。所以,如果一个库的版本号改变了,或如果他有一个不同的公钥,这些区别制定了不同的程序集。
结果就是在GAC中可以有许多不同的程序集,它们有相同的文件名。虽然它们有相同的文件名,它们是不同的程序集而且在GAC中完美地共存。这使不同的应用程序在同一时间很容易使用不同版本的同一DLL,因为它们是带不同的标识符的不同程序集。这被称为并肩执行。
-> 配置文件
配置文件含有关于应用程序的信息,供CLR在运行时使用。
配置文件由XML代码组成,并不包含C#代码。它们的一种用途是更新一个应用程序集以使用新版本的DLL。
例如:假设有一个应用程序引用了GAC中的一个DLL。在应用程序的清单中,该引用的标识符必须完全匹配GAC中程序集的标识符。如果一个新版本的DLL发布了,它可以被添加到GAC中,在那里它可以幸福地和老版本共存。
然而,应用程序仍然在它的清单中包括老版本DLL的标识符。除非重新编译应用程序并使它引用新版本的DLL,否则他会继续使用老版本。
然而,如果你不像重新编译程序但又希望它使用新的DLL,那么你可以创建一个配置文件告诉CLR去使用新的版本而不是旧版本。配置文件被放在应用程序目录中。
-> 延迟签名
在延迟签名中,编译器只使用公钥/密钥对中的公钥。然后公钥可以被放在完成的程序集的标识符清单中。延迟签名还是用一个为0的块保留数字签名的位置。
要创建一个延迟签名的程序集,必须做两件事情。
1、创建一个密钥文件的复制,它只有公钥而不是公钥/私钥对。
2、为程序集范围内的源代码添加一个名称为DelaySignAttribute的附加特性,并把它的值设为true。
延迟签名程序集的输入和输出
1、在输入中,DelaySignAttribute定位于源文件中,而且密钥文件只含有公钥。
2、在输出中,在程序集的底部有一个数字签名的保留空间。
如果你试图部署延迟签名的程序集到GAC,CLR不会允许,因为他不是强命名的。要子啊这台机器上部署它,必须首先使用命令行指令取消在这台机器上的GAC签名确认,只针对这个程序集,并允许它被装在GAC中。要做到这点,从VS命令提示中执行下面的确认:
sn -vr MyAssembly.dll
编译器接受源代码文件并生成名称为程序集的输出文件。
这些程序集称为类库,而且它们的程序集文件的名称通常以.dll扩展名结尾而不是.exe扩展名
-> mscrolib库
它就是包含Console类的那个库。Console类被定义在名称为mscrolib的程序集中,在名称为mscrolib.dll的文件里。程序集mscrolib.dll含有C#类型以及大部分.NET语言的基本类型的定义。在编译C#程序时,他必须总是被引用,所以VS不把它显示在Reference目录中。
说明:如果两个程序集中都好有名称相同的类的声明,编译器不知道实例化那一个。
-> 命名空间
命名空间名和命名空间的定义:
-> 你可以把命名空间名视为一个字符串(在字符串中可以使用点),它加在类名或类型名的前面并且通过点进行分割
-> 包括命名空间名、分隔点,以及类名的完整字符串叫做类的完全限定名。
-> 命名空间是共享命名空间的一组类和类型。
-> 你可以使用命名空间来把一组类型组织在一起并且给他们起一个名字。一般而言,命名空间名描述的是命名空间中包含的类型,并且和其他命名空间名不同。
你可以通过在包含你的类型声明的源文件中声明命名空间,从而创建命名空间。
namespace NamespaceName
{
TypeDeclarations
}
创建MyCorp.SuperLib命名空间以及声明其中的SquareWidgate类
namespace MyCorp.SuperLib
{
public clas SquareWidget
{
...
}
}
-> 命名空间名称
命名空间的名称可以包含创建该程序集的公司的名称。除了标识公司以外,该名称还用于帮助程序员获得定义在命名空间内的类型的种类的快速印象。
1、命名空间名称可以是任何有效标识符
2、另外,命名空间名称可以包括句点符号,用于把类型组织成层次。
下面是建议的命名空间命名指南:
1、使用公司名开始命名空间名称
2、在公司名之后跟着技术名称
3、不要把命名空间命名为与类或类型相同的名称。
-> 命名空间的补充
关于命名空间,有其他几个重点应该知道:
1、在命名空间内,每个类型名必须有别与所有其它类型。
2、命名空间内的类型称为命名空间的成员
3、一个源文件可以包含任意数目的命名空间声明,可以顺序也可以嵌套。
SimpleProg.cs 中包含两个namespace
namespace MyNS
{
class FirstClass{...}
class SecondClass{...}
}
namespace OtherNS
{
class FirstClass{...}
class SecondClass{...}
struct MyStruct{...}
}
-> 命名空间跨文件伸展
命名空间不是封闭的。这意味着可以在该源文件的后面或另一个源文件中再次声明它,以对它增加更多的类型声明。
源文件可以被编译成单一的程序集,或编译成分离的程序集
-> 嵌套命名空间
命名空间可以被嵌套,从而产生嵌套的命名空间。嵌套命名空间允许你创建类型的概念层次。
有两种方法声明一个嵌套的命名空间:
1、原文嵌套:
可以把命名空间的声明放在一个封装的命名空间声明体内部,从而创建一个嵌套的命名空间。
namespace MyNamespace
{
class MyClass{...}
namespace Others
{
class OtherClass{...}
}
}
2、分离的声明
也可以为嵌套命名空间创建分离的声明,但必须在声明中使用它的完全限定名称。
namespace MyNamespace
{
class MYClass{...}
}
namespace MyNamespace.OtherNS
{
class OtherClass{...}
}
虽然嵌套命名空间位于父命名空间内部,但是其成员un并不属于包裹的父命名空间。
-> using指令
using命名空间指令和using别名指令
关于using指令词的两个重点:
1、它们必须放在源文件的顶端,在任何类型声明之前
2、它们应用于当前源文件中的所有命名空间
-> using命名空间指令
可以通过在源文件的顶端放置using命名空间指令以避免不得不使用长名称
using命名空间指令通知编译器你将要使用来自某个指令命名空间的类型。然后你可以继续,并使用简单类名而不必全路径修饰它们。
using命名空间指令由关键字using跟着一个命名空间标识符组成。
using System
-> using别名指令
using别名指令允许起一个别名给:
-> 命名空间 using Syst = System;
-> 命名空间内的一个类型 using SC = System.Console;
-> 程序集的结构
程序集不包含本地机器代码,而是公共中间语言代码。他还包含实时编译器(JIT)在运行时转换CIL到本地代码所需的一切,包括对它所引用的其他程序集的引用。程序集的文件扩展名通常为.exe或.dll
大部分程序集由一个单独的文件构成。
-> 程序集的清单包含以下几点:
1、程序集名称标识符
2、组成程序集的文件列表
3、一个指示程序集中内容在哪里的地图
4、关于引用的其他程序集的信息。
-> 类型元数据部分包含该程序集中定义的所有类型的信息,这些信息包含关于每个类型要知道的所有事情。
-> CIL部分包含程序集的所有中间代码
-> 资源部分是可选的,但可以包含图形或语言资源
对于有多个模块的程序集,一个文件是主模块,而其他的是次要模块
1、主模块含有程序集的清单和到次要模块的引用。
2、次要模块的文件名以扩展名.netmodule结尾
3、多文件程序集被视为一个单一单元。它们一期部署并一起定版。
-> 程序集标识符
在.NET框架中,程序集的文件名不像在其他操作系统和环境中那么重要,更重要的是程序集的标识符。
程序集的标识符有4个组成部分,它们一起唯一标识了该程序集。
1、简单名:这只是不带文件扩展名的文件名。每个程序集都有一个简单名。它也被称为程序及名或有好名称
2、版本号:它由4个句点分开的整数字符串组成,例如:2.0.35.9
3、文化信息:它是一个字符串,由2~5分字符组成,代表一种语言,或代表一种语言和一个国家或一个地区
4、公钥:这个128字节字符串应该是生产该程序集的公司唯一的
程序集名称的组成被包含在程序集清单中。
标识符:简单名、版本、文化、公钥共同组成程序集的标识符
完全限定名称:由简单名、版本、文化和表示为16字节公钥凭据的公钥组成的列表文本
显示名称:和完全限定名称相同
-> 强命名程序集
强命名程序集有一个唯一的数字签名依附于它。强命名程序集比没有强名称的程序集更加安全,原因:
1、强名称唯一标识了程序集,没有其他人能创建一个与之有相同名称的程序集,所以用户可以确信该程序集来自于其声称的来源。
2、没有CLR完全组建类捕获更改,带强名称的程序集的内容不能被更改
弱命名程序集是没有被强命名的程序集。由于弱命名程序集没有数字签名,他天生是不安全的。
程序员不产生强名称。编译器产生他,接受关于程序集的信息,并哈希这些信息以创建一个唯一的数据签名依附到该程序集。它在哈希处理中使用的信息如下:
1、组成程序集的字节序列
2、简单名称
3、版本号
4、文化信息
5、公钥/密钥对
创建强命名程序集
要使用VS强命名一个程序集,必须有一份公钥/私钥对文件的赋值。如果没有密钥文件,可以让VS产生一个。可以实行以下步骤:
1、打开工程的属性
2、选择签名页
3、选择为程序集复选框签名并输入密钥文件的位置或创建一个新的。
-> 程序集的私有方式部署
如果应用程序不需要其他程序集,或如果所需的DLL在同意目录下,那么程序应该会就在它所在的地方良好工作。这种方法部署的程序集称为私有程序集,而且这种部署方法称为复制文件部署。
私有程序集几乎可以被放在任何目录中,而且只要它们依赖的文件都在同一目录或子目录中就足够了。事实上,可以在文件系统的不同部分有多个目录,每个目录都有同样的一组程序集,并且它们都会在它们个字不同的位置良好工作。
关于私有程序集不熟的一些重要事情:
1、私有程序集所在的目录被称为应用程序目录
2、私有程序集可以是强命名的也可以使弱命名的
3、没有必要在注册表中注册组件
4、要卸载一个私有程序集,只要从文件系统中删除它即可
-> 共享程序集和GAC(Global Assembly Cache)
私有程序集是非常有用的,但有时你会想把以DLL放在一个中心位置,这样一个单独的复制就能被系统中其他的程序集共享。.NET有这样的贮藏库,称为全局程序集缓存(GAC)。放进GAC的程序集称为共享程序集。
关于GAC的一些重要内容:
1、只有强命名程序集能被添加到GAC。
2、虽然GAC的早期版本只接受带.dll扩展名的文件,现在也可以添加带.exe扩展名的程序集了。
3、GAC位置在名称为Assembly的子目录下,在Windows系统目录中。
-> 把程序集安装到GAC
当试图安装一个程序集到GAC时,CLR的安全组件首先必须检验程序集上的数字签名是否有效。如果没有数据签名,或它是无效的,系统将不会把它安装到GAC。
然而,这是个一次性检查。在程序集已经在GAC内之后,当它被一个正在运行的程序引用时,不再需要进一步的检查。
gacutil.exe命令行工具允许从GAC添加或删除程序集,并列出GAC包含的程序集。它的3个最有用的参数标记:
1、/i:把一个程序集插入GAC
2、/u:从GAC卸载一个程序集
3、/l:列出GAC中的程序集
-> GAC内的并肩执行
在程序集部署到GAC之后,它能被系统中其他程序集使用了。然后,请记住程序集的标识符由完全限定名称的全部4个部分组成。所以,如果一个库的版本号改变了,或如果他有一个不同的公钥,这些区别制定了不同的程序集。
结果就是在GAC中可以有许多不同的程序集,它们有相同的文件名。虽然它们有相同的文件名,它们是不同的程序集而且在GAC中完美地共存。这使不同的应用程序在同一时间很容易使用不同版本的同一DLL,因为它们是带不同的标识符的不同程序集。这被称为并肩执行。
-> 配置文件
配置文件含有关于应用程序的信息,供CLR在运行时使用。
配置文件由XML代码组成,并不包含C#代码。它们的一种用途是更新一个应用程序集以使用新版本的DLL。
例如:假设有一个应用程序引用了GAC中的一个DLL。在应用程序的清单中,该引用的标识符必须完全匹配GAC中程序集的标识符。如果一个新版本的DLL发布了,它可以被添加到GAC中,在那里它可以幸福地和老版本共存。
然而,应用程序仍然在它的清单中包括老版本DLL的标识符。除非重新编译应用程序并使它引用新版本的DLL,否则他会继续使用老版本。
然而,如果你不像重新编译程序但又希望它使用新的DLL,那么你可以创建一个配置文件告诉CLR去使用新的版本而不是旧版本。配置文件被放在应用程序目录中。
-> 延迟签名
在延迟签名中,编译器只使用公钥/密钥对中的公钥。然后公钥可以被放在完成的程序集的标识符清单中。延迟签名还是用一个为0的块保留数字签名的位置。
要创建一个延迟签名的程序集,必须做两件事情。
1、创建一个密钥文件的复制,它只有公钥而不是公钥/私钥对。
2、为程序集范围内的源代码添加一个名称为DelaySignAttribute的附加特性,并把它的值设为true。
延迟签名程序集的输入和输出
1、在输入中,DelaySignAttribute定位于源文件中,而且密钥文件只含有公钥。
2、在输出中,在程序集的底部有一个数字签名的保留空间。
如果你试图部署延迟签名的程序集到GAC,CLR不会允许,因为他不是强命名的。要子啊这台机器上部署它,必须首先使用命令行指令取消在这台机器上的GAC签名确认,只针对这个程序集,并允许它被装在GAC中。要做到这点,从VS命令提示中执行下面的确认:
sn -vr MyAssembly.dll