• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

asp.net中的assembly

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

概念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文件便能找到如下配置节点


<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目录)

 

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[ASP.NET 控件实作 Day11] ActiveX 服务器控件发布时间:2022-07-10
下一篇:
asp.netmvc自动压缩文件,并生成CDN引用发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap