#定义自定义命名空间
1.
// c1
using System;
namespace MySpaces
{
public class Circle{}
}
// c2
namespace MySpaces
{
public class Square{}
}
// main
namespace Custom
{
using TheSquare = MySpaces.Square;
static void Main()
{
Circle c = new MySpaces.Circle();
using namespace MySpaces;
Squre s = new Square();
TheSquare s2 = new TheSquare();
}
}
2.嵌套命名空间
namespace Chapter14
{
namespace MyShapes
{
}
}
//
namespace Chapter14.MyShapes
{
}
#.NET程序集作用
1.程序集是一个以公共语言运行库为宿主的,版本化的,自描述的二进制文件。
2.完成的类型限定:
程序集.命名空间.类型
3.每个.NET程序集被分配一个格式为...。
版本号加上公钥值使一个程序集的不同版本在同一个机器上能共处。
强命名程序集:提供了公钥信息
私有程序集:与调用它的客户端应用处于同一个目录下。【或其子目录下】
共享程序集:全局程序集缓存的特定目录中。
4…NET程序集的格式
windows文件首部
CLR文件首部
CIL代码
类型元数据
程序集清单
可选的嵌入资源
查看程序集信息工具:
dumpbin.exe
4.1.CIL代码
独立于平台和CPU的中间语言。
4.2.元数据
描述了程序集内含类型和引用外部类型格式。
4.3.清单
程序集的模块,版本,和引用的外部程序集。
4.4.可选的嵌入资源
##.私有程序集:
放置在客户端应用程序所在目录或其子目录下。
1.1.私有程序集标识
1.2.加载程序集
隐式:
CLR查询清单时,
显示:
调用System.Reflection.Assembly的Load()或LoadFrom()时。
客户端应用程序目录和其子目录下的 Name.dll
客户端应用程序目录和其子目录下的 Name.exe
引发FileNotFoundException
1.3.配置文件
ApplicationName.exe.config
须位于客户端应用程序目录下。
##共享程序集
1.1.全局程序集缓存
一个共享程序集部署在GAC中,GAC的确切位置取决于目标机器安装的.NET平台版本。
3.5或更早版本:C:\Windows\assembly
4.5或更后版本:C:\Windows\Microsoft.NET\assembly\GAC_MSIL。
v4.0_major.minor.build.revision_publicKeyTokenValue
1.2.强名称
部署程序集到GAC前,须赋予它一个强名称。
强名称由一组相关数据组成:
程序集的友好名称【程序集名称-文件扩展名】
程序集的版本号【AssemblyVersion赋值】
公钥值【AssemblyKeyFile赋值】
用于本地化的可选的区域性标识【AssemblyCulture赋值】
嵌入的数字签名【基于内容的散列值和私钥值】
1.3.生成强名称
.NET Framework4.5的sn.exe生成 公钥/私钥对。
.publickey 记录公钥值。
基于程序集内容产生散列码 + *.snk文件的私钥组成数字签名。并把它嵌入程序集的CLR首部数据。
1.4.使用命令行生成强名称
sn -k MyTestKeyPair.snk // 文件内包含 生成的 公钥/私钥对。
AssemblyInfo.cs的[AssemblyKeyFile]用来告诉编译器有效的*.snk文件的位置所在。
如:
[assembly: AssemblyKeyFile(@“C:\MyTestKeyPair\MyTestKeyPair.snk”)]
版本号:
AssemblyInfo.cs的[assembly:AssemblyVersion(“1.0.0.0”)]
或者
AssemblyInfo.cs的[assembly:AssemblyVersion(“1.0.*”)]
如果要使用VS中用户界面创建强命名的程序集,而不再使用sn.exe工具。
须在AssemblyInfo.cs中删除[assembly: AssemblyKeyFile]
1.5.在GAC中安装强名称程序集
gacutil.exe
-i 将强名称程序集安装入GAC
-u 从GAC中卸载程序集
-l 在GAC中显示程序集
1.6.引用强命名程序集
引用强命名程序集时,不会把该库拷贝到客户端应用程序的输出文件夹。
1.7.一个客户端应用引用一个强名称程序集时,.NET会把该程序集的公钥压缩成散列值,然后存放在客户端应用程序清单的.publickeytoken标签里。
CLR在GAC中找不到ver和publickeytoken符合要求的程序集时,继续在客户端应用程序目录下找,仍找不到,抛出FileNotFoundException。
##配置共享程序集
1.在应用程序目录下,新建
AppName.exe.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="CarLibrary"
publicKeyToken="64ee9364749d8328"
culture="neutral"/>
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0"/>
</dependentAssembly>
// 禁用发行者策略程序集
//<publisherPolicy apply="no ">
</assemblyBinding>
</runtime>
// System.Configuration.AppSettingsReader.GetValue(string keyname, Type type)
<appSettings>
<add key="TextColor" value="Green">
...
<add key="xx" value="xxx">
</appSettings>
</configuration>
// XML配置文件使用说明:
// Configuration File Schema for the .NET Framework
2.在GAC中
al /link:CarLibraryPolicy.xml /out:policy.1.0.CarLibrary.dll /keyf:C:\MyKey.snk /v:1.0.0.0