asp.net中的assembly

发布或者调试asp.net程序的时候,经常会发现程序不能找到(load)到相应的程序集。这个问题经常困扰像我这样的新手,于是在我查阅众多文档后,整理如下。权当抛砖引玉,希望高手参与讨论。

概念1.配置系统是分层的,最高层的是machine.config,位于\%windows%\Microsoft.Net\Framework\VersionNumber\CONFIG目录下,此目录还有一个机器范围的全局web.config,每个web应用程序中的每个目录和子目录最多只能有一个web.config文件。如果web.config文件中包含的配置信息与更高层次的配置发生冲突的话,那么低层配置将覆盖并应用于自身目录及其所有子目录下。

asp.net中的assembly

此图下面的edit global configuration 便是修改机器级别的全局web.config,edit configuration 则是修改每个应用程序的web.config。

概念2.任何程序集(assembly)使用的时候都需要添加引用(reference),无一例外,包括System命名空间。

可是为什么我们不用手动添加System命名空间,如果当你打开\%windows%\Microsoft.Net\Framework\VersionNumber\CONFIG目录下机器范围的web.config文件便能找到如下配置节点


< assemblies >
        
< add  assembly ="mscorlib" />
        
< add  assembly ="System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        
< add  assembly ="System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        
< add  assembly ="System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        
< add  assembly ="System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        
< add  assembly ="System.Web.Services, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        
< add  assembly ="System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        
< add  assembly ="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        
< add  assembly ="System.EnterpriseServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        
< add  assembly ="System.Web.Mobile, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        
< add  assembly ="*" />
        
< add  assembly ="System.ServiceModel.Web, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        
< add  assembly ="System.WorkflowServices, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        
< add  assembly ="System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" />
        
< add  assembly ="System.IdentityModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" />
        
< add  assembly ="System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</ assemblies >

 

这就是为什么我们一般不需要在自己单独的应用程序的web.config中再添加System的引用了(当然愿意自己再写一遍,也不会有啥问题)。

当你要添加外部的程序集时,你会在bin目录右键然后选择添加引用,那么bin目录便会得到一份copy的dll文件,可是如果是有的.net的程序集,却不会得到copy而是在<assemblies>下多了一个add的

概念3. 程序集的分类()

CLR将程序集分为私有程序集和GAC

GAC=Global Assembly Cache,即全局程序集缓存或者叫做共享程序集缓存,注册到GAC中的程序集一般都可以在\windows\assembly目录中找到,里面可以看到

程序集的名字、版本号、culture、公钥(publicTokenKey),如果你要引用的话,有2中方法

      1.手动web.config中的assemblies节点添加一个add

      2.bin目录下添加引用找到相应的程序集(会自动做第一步)

 

我们自己的外部的程序集需要引用的时候用方法1会失效,因为我们自己的程序集是私有的,没有注册到GAC中,你加个add系统怎么知道去哪找你的程序集,所以右键bin目录添加引用的适合,bin目录会得到一份dll的copy。

 

问题1.为什么GAC的目录是\windows\assembly?

答:此路径是可以更改,可配置的

问题2.CLR搜索程序集顺序

答:先GAC然后搜索应用程序集缓存(如bin目录,app_code目录)

 

 

 

你可能感兴趣的:(assembly)