精通C#--用.NET程序集编程

#定义自定义命名空间
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值