java有程序集_关于强命名程序集

如何创建强命名程序集(

Strong Name Assembly

)

创建一个强命名程序集首先需要获得一个用强命名实用工具

(

Strong Name Utility

,即

SN.exe

.NET SDK

自带)产生的密钥。

下面简要介绍一下

SN.exe

的一些用法。

要产生一个公钥

/

私钥对:

a)SN –k MyCompany.Keys

该命名告诉

SN.exe

创建一个名为

MyCompany.keys

的文件。

MyCompany.keys

文件将包含以对以二进制格式存储的公有密钥和私有密钥。

b)

查看公有密钥:

首先生成一个只包含公有密钥的文件:

SN –p

MyCompany.keys MyCompany.PublicKey

然后用

-tp

参数查看:

SN –tp MyCompany.PublicKeys

Public key is

00240000048000009400000006020000002400005253413

10004000001000100bb7214723ffc13901343df4b9c464ebf

7ef4312b0ae4d31db04a99673e8163768cc0a2a7062e731d

beb83b869f0509bf8009e90db5c8728e840e782d2cf928dae

35c2578ec55f0d11665a30b37f8636c08789976d8ee9fe9a5

c4a0435f0821738e51d6bdd6e6711a5acb620018658cce93

df37d7e85f9a0104a5845053995ce8

Public key token is 2dc940d5439468c2

创建好了公钥

/

私钥对,创建强命名程序集就很容易了。只需要把

System.Reflection.AssemblyKeyFileAttribute

特性加入到源代码中就可以了:

?[assembly:AssemblyKeyFile("MyCompany.keys")]

说明:公钥

/

私钥对文件的扩展名可以是任意的(也可以没有),因为编译的时候都是以元数据的格式读取的。

4.

程序集的部署方式

一个程序集有两种部署方式:

a)

私有方式

和应用程序部署在同一目录下的程序集称作私有部署程序集。弱命名程序集只能进行私有部署。

b)

全局方式

全局部署方式将程序集部署在一些

CLR

已确知的地方,当

CLR

搜索程序集时,它会知道到这些地方去找。强命名程序集既可以进行私有部署,也可以进行全局部署。

5.

如何部署强命名程序集(

Strong Name Assembly

)和

GAC

a)GAC

的概念

如果一个

Assembly

要被多个应用程序访问,那么他就必须放在一个

CLR

已确知的目录下,并且

CLR

在探测到有对该

Assembly

的引用时,它必须能自动到该目录下寻找这个程序集。这个已确知的目录称作

GAC

(

Global Assembly Cache

),就是全局程序集缓存。它一般位于下面的目录下:

:/Windows/Assembly/GAC

GAC

的作用就是提供给

CLR

一个已知的确定的目录去寻找引用的

程序集。

b)GAC

的内部结构

GAC

是一个特殊的结构化的目录,用

Windows Explorer

浏览你会以为它只是一个包含很多程序集的普通目录。其实不是这样的,在命令行下查看,你会发现它实际上包含很多子目录,子目录的名字和程序集的名称是相同的,但它们都不是实际的程序集,实际的程序集位于程序集名对应的目录下。比如进入

GCFWK

子目录,我们会发现其中又有很多的子目录。机器内每一个安装到

GAC

GCFWK.dll

GCFWK

中都会有一个子目录。

这里只

有一个目录表明只有一个版本的

GCFWK

程序集被安装。实际的程序集保存在每一个对应的版本目录下。目录的名称以下划线的形式分割为

“(Version)_(Culture)_(PublicKeyToken)”

GCFWK

的语言文化信息为

netture

,就表示为

0.0.0

__bf5779af662fc055”

表示得意义是:

“GCFWK, Version=1.0.0.0, Culture=neutral,PublicKeyToken=bf5779af662fc055”

如果语言文化信息为

”ja”

,就表示

”1.0.0.0_ja_bf5779af662fc055”

表示得意义是:

“GCFWK, Version=1.0.0.0, Culture=ja, PublicKeyToken=bf5779af662fc055”

c)

部署强命名程序集到

GAC

GAC

包含很多子目录,这些子目录是用一种算法来产生的,我们最好不要手动将程序集拷贝到

GAC

中,相反,我们应使用工具来完成这样的工作。因为这些工具知道

GAC

的内部结构

J

在开发和测试中,最常用的工具就是

GACUtil.exe

GAC

中注册程序集跟

COM

注册差不多,但相对更容易:

1

.把程序集添加到

GAC

中:

GACUtil /i sample.dll

(参数

/i

是安装的意思)

2

.把程序集移出

GAC GACUtil /u sample.dll

(参数

/u

就移除的意思)

注意:不能将一个弱命名程序集安装到

GAC

中。

如果你试图把弱命名程序集加入到

GAC

中,会收到错误信息:

Failure adding assembly to the cache: Attempt to install an assembly without a strong name”

d)

强命名程序集的私有部署

把程序集安装到

GAC

有几个好处。首先,

GAC

使得很多程序可以共享程序集,这从整体上减少了使用的物理内存;其次,我们很容易将一个新版的程序集部署到

GAC

中,并通过一种发布者策略(差不多就是一种重定向方法,比如将原来引用版本为

1.0.0.0

程序集的程序,通过更改它的配置文件,转而让程序去引用版本为

2.0.0.0

的程序集)来使用新版本;最后,

GAC

还提供了对不同版本程序集的并存(

side-by-side

)管理方式。但是,

GAC

的安全策略通常只允许管理员更改,同时,向

GAC

中安装程序集也破坏了

.NET

框架的简单拷贝部署的许诺。

除了向

GAC

或者以私有部署方式部署强命名程序集之外,我们还可以将强命名程序集部署在仅为一小部分程序知道的某个任意目录下。配置每一个应用程序的

XML

配置文件,让它们指向一个公有目录,这样,在运行时,

CLR

将知道到哪里去找这个强命名程序集。但这样又有可能会引发

”DLL Hell”

的问题,因为没有哪个程序可以控制这个程序集何时被卸载。这在

.NET

中也是不被鼓励的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值