热门话题VB.NET DLL搜索路径经典讲解

开发 后端
知道VB.NET DLL搜索路径吗?在这里给大家就VB.NET DLL搜索路径的原理和概念上进行简单的分析,希望可以给大家带来帮助。

有些人都认为VB.NET DLL搜索路径和VC一样,什么Path路径、系统路径。但是其实它们是不一样的。在网上收集了一些资料,现在我们来看看吧。我印象当中,VB.NET DLL搜索路径要么是exe目录,要么是GAC,要么是config文件指定的目录。可惜config只能提供给exe使用,dll没有cinfig。

托管模块(Managed Module)
 
托管模块是一个需要CLR才能执行的标准Windows可移植可执行(portable executable,简称PE)文件。

元数据(Metadata)
 
简单的讲,元数据就是一个数据表的集合,在这些表中,其中一些用于描述托管模块中所定义的内容(比如所定义的类型和它们的成员),另外还有一些用于描述托管模块中所引用的内容(比如被引用的类型和它们的成员)。

  1. URL: ms-help://MS.MSDN   
  2. QTR.2004APR.1033/cpguide/html/cpconmetadataoverview.htm   

程序集清单(Assembly Manifest)
程序集清单是另外一些元数据表的集合。这些表描述了组成程序集的文件,程序集所有文件中实现的公有导出类型,以及一些程序集相关的资源文件或数据文件。

  1. ms-help://   
  2. MS.MSDNQTR.2004APR.1033/cpguide/html/cpconAssemblyManifest.htm   

1.程序集(Assembly)的概念:
 
首先:程序集是一个或多个托管模块,以及一些资源文件的逻辑组合。因为它是一个逻辑上的组合,所以程序集的逻辑表示和物理表示可以相互分离。如何将代码和资源划分到不同的文件中完全取决于我们。例如,我们可以将一些很少使用的类型或资源放在一个单独的Assembly Module中,然后根据需要(比如第一次用到的时候),从web上下载它们。如果没有用到,它们将不会被下载。这样既节省磁盘空间,也减少了安装时间。程序集允许我们将文件的部署分解开来,同时又将所有的文件看作一个单独的集合。
其次:因为CLR是直接和程序集打交道的,所以程序集也是组件复用,以及实施安全策略和版本策略的最小单元(安全策略,版本信息等都只能是加在程序集上)。

注意:程序集是一个逻辑组合,它可以包含很多个文件。大多数程序集(比如使用Visual Studio.NET创建的那些)一般都是单文件程序集,也就是只有一个.exe或者.dll文件(目前.NET的程序集只有这两种格式)。在这种情况下,程序集清单(manifest)直接嵌入到单文件程序集中。但是,你也可以用“程序集生成工具”(Al.exe)来创建多文件程序集。也可以只创建一个只包含清单的程序集。

2.强命名程序集(Strong Name Assembly)的概念

因为不同的公司可能会开发出有相同名字的程序集来,如果这些程序集都被复制到同一 个相同的目录下,最后一个安装的程序集将会代替前面的程序集。这就是著名的Windows “DLL Hell”出现的原因。

很明显,简单的用文件名来区分程序集是不够的,CLR需要支持某种机制来唯一的标识一个程序集。这就是所谓的强命名程序集。 一个强命名程序集包含四个唯一标志程序集的特性:文件名(没有扩展名),版本号,语言文化信息(如果有的话),公有秘钥。 这些信息存储在程序集的清单(manifest)中。清单包含了程序集的元数据,并嵌入在程序集的某个文件中。

下面的字符串标识了四个不同的程序集文件:

  1. “MyType, Version=1.0.1.0,   
  2. Culture=neutralPublicKeyToken=bf5779af662fc055”   
  3. “MyType, Version=1.0.1.0,   
  4. Culture=en-us, PublicKeyToken=bf5779af662fc055”   
  5. “MyType, Version=1.0.2.0,   
  6. Culture=neturlPublicKeyToken=bf5779af662fc055”   
  7. “MyType, Version=1.0.2.0,   
  8. Culture=neutralPublicKeyToken=dbe4120289f9fd8a”    

如果一个公司想唯一的标识它的程序集,那么它必须首先获取一个公钥/私钥对,然后将共有秘钥和程序集相关联。不存在两个两个公司有同样的公钥/私钥对的情况,正是这种区分使得我们可以创建有着相同名称,版本和语言文化信息的程序集,而不引起任何冲突。

与强命名程序集对应的就是所谓的弱命名程序集。(其实就是普通的没有被强命名的程序集)。两种程序集在结构上是相同的。都使用相同的PE文件格式,PE表头,CLR表头,元数据,以及清单(manifest)。二者之间真正的区别在于:强命名程序集有一个发布者的公钥/私钥对签名,其中的公钥/私钥对唯一的标识了程序集的发布者。利用公钥/私钥对,我们可以对程序集进行唯一性识别、实施安全策略和版本控制策略,这种唯一标识程序集的能力使得应用程序在试图绑定一个强命名程序集时,CLR能够实施某些“已确知安全”的策略(比如只信任某个公司的程序集)。

3.如何创建强命名程序集(Strong Name Assembly)

创建一个强命名程序集首先需要获得一个用强命名实用工具 (Strong Name Utility,即SN.exe,.NET SDK自带)产生的密钥。下面简要介绍一下SN.exe的一些用法。 要产生一个公钥/私钥对:

a)SN –k MyCompany.Keys
该命名告诉SN.exe创建一个名为MyCompany.keys的文件。MyCompany.keys文件将包含以对以二进制格式存储的公有密钥和私有密钥。

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

  1. SN –p   
  2. MyCompany.keys MyCompany.PublicKey  

然后用-tp参数查看:

创建好了公钥/私钥对,创建强命名程序集就很容易了。只需要把System.Reflection.AssemblyKeyFileAttribute特性加入到源代码中就可以了:?[assembly:AssemblyKeyFile("MyCompany.keys")] 说明:公钥/私钥对文件的扩展名可以是任意的(也可以没有),因为编译的时候都是以元数据的格式读取的。

  1. SN –tp MyCompany.PublicKeys   
  2. Public key is   
  3. 00240000048000009400000006020000002400005253413   
  4. 10004000001000100bb7214723ffc13901343df4b9c464ebf   
  5. 7ef4312b0ae4d31db04a99673e8163768cc0a2a7062e731d   
  6. beb83b869f0509bf8009e90db5c8728e840e782d2cf928dae   
  7. 35c2578ec55f0d11665a30b37f8636c08789976d8ee9fe9a5   
  8. c4a0435f0821738e51d6bdd6e6711a5acb620018658cce93   
  9. df37d7e85f9a0104a5845053995ce8   
  10. Public key token is 2dc940d5439468c2   

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)”。

【编辑推荐】

  1. VB.NET获取硬盘信息四大法宝
  2. 讲述VB.NET调用Excel的好处
  3. 简单例子概述VB.NET新窗体
  4. 描述VB.NET工程转换成步骤
  5. 自己动手实现VB.NET控件数组
责任编辑:田树 来源: qqread
相关推荐

2009-10-23 15:35:42

VB.NET实用教程

2009-10-20 10:16:24

VB.NET COMB

2010-01-11 16:04:10

VB.NET使用wit

2021-09-26 10:19:21

Kubernetes网络安全网络攻击

2009-10-23 13:10:14

VB.NET List

2009-10-12 13:54:22

VB.NET Data

2009-10-15 11:42:05

VB.Net赋值语句

2009-10-29 17:33:51

VB.NET线程方法

2009-10-14 17:21:47

VB.NET定制Win

2010-01-18 18:20:49

VB.NET使用API

2009-10-13 14:42:30

VB.NET静态成员

2010-01-15 16:12:40

VB.NET调用DLL

2014-02-21 13:10:00

RSA大会RSA2014大会安全大会

2009-10-29 11:26:28

VB.NET调用Web

2009-10-28 13:24:25

VB.NET文件

2009-11-10 16:20:25

VB.NET全局热键

2010-01-14 15:44:17

VB.NET数据绑定

2009-10-10 17:06:09

VB和VB.NET

2009-10-26 12:39:09

VB.NET通信程序

2009-10-19 09:16:08

VB.NET语言
点赞
收藏

51CTO技术栈公众号