asp.net中的assembly
发布或者调试asp.net程序的时候,经常会发现程序不能找到(load)到相应的程序集。这个问题经常困扰像我这样的新手,于是在我查阅众多文档后,整理如下。权当抛砖引玉,希望高手参与讨论。
![]()
<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>
概念1.配置系统是分层的,最高层的是machine.config,位于\%windows%\Microsoft.Net\Framework\VersionNumber\CONFIG目录下,此目录还有一个机器范围的全局web.config,每个web应用程序中的每个目录和子目录最多只能有一个web.config文件。如果web.config文件中包含的配置信息与更高层次的配置发生冲突的话,那么低层配置将覆盖并应用于自身目录及其所有子目录下。

此图下面的edit global configuration 便是修改机器级别的全局web.config,edit configuration 则是修改每个应用程序的web.config。
概念2.任何程序集(assembly)使用的时候都需要添加引用(reference),无一例外,包括System命名空间。
可是为什么我们不用手动添加System命名空间,如果当你打开\%windows%\Microsoft.Net\Framework\VersionNumber\CONFIG目录下机器范围的web.config文件便能找到如下配置节点


















这就是为什么我们一般不需要在自己单独的应用程序的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目录)
posted on 2009-06-05 15:29 MoonWalker 阅读(774) 评论(0) 收藏 举报