Asp.net 下把自己的程序集加入到 GAC

因为服务器的性能有限,发现自从使用了 Castle + Nhibernate 之后,服务器在更新web站点之后的重新编译过程特别漫长,有时候都超过了1分钟,尽管发布的web程序也是编译好的。下面是web使用的动态库:

(原文链接 http://ddbiz.com/?p=195)

Castle.Core.dll
Castle.DynamicProxy2.dll
Castle.Facilities.AutomaticTransactionManagement.dll
Castle.Facilities.NHibernateIntegration.dll
Castle.MicroKernel.dll
Castle.Services.Transaction.dll
Castle.Windsor.dll
FredCK.FCKeditorV2.dll
Iesi.Collections.dll
log4net.dll
MySql.Data.dll/System.Data.SQLite.dll
NHibernate.dll
UrlRewritingNet.UrlRewriter.dll

 

每次我的web项目有更新重新编译后生成的web.dll上传到服务器,服务器w3p就会重启,csc我的web目录下的文件,整个过程真是漫长的无法忍受。

 

[不知道各位大侠有没有什么好的建议]

 

后来想到把上面的那些动态库放入 GAC 中,会不会减少重启需要时间(实践证明没有明显的变化)。

 

本文没有解决当初的问题,但是因为涉及到一个在 asp.net 中引用存放在GAC中的第三方动态库的问题,所以还是记录下来(:-)这才是本文重点)。

 

上面所有的动态库都是签过名的,放入GAC的过程:

1. 注册第三方动态库入GAC

 

gacutil -i Castle.Core.dll
gacutil -i Castle.DynamicProxy2.dll
gacutil -i Castle.Facilities.AutomaticTransactionManagement.dll
gacutil -i Castle.Facilities.NHibernateIntegration.dll
gacutil -i Castle.MicroKernel.dll
gacutil -i Castle.Services.Transaction.dll
gacutil -i Castle.Windsor.dll
gacutil -i FredCK.FCKeditorV2.dll
gacutil -i Iesi.Collections.dll
gacutil -i Intelligencia.UrlRewriter.dll
gacutil -i log4net.dll
gacutil -i MySql.Data.dll
gacutil -i NHibernate.dll
gacutil -i System.Data.SQLite.dll
gacutil -i UrlRewritingNet.UrlRewriter.dll

 

这个过程比较容易,gacutil 可以在 .net framework 的 sdk 下找到(再分发包)

 

2. 重新定义web项目对第三方动态库的引用方式:直接引用 GAC

 

这里遇到另外一个问题, vs2005中无法引用到自己定义到GAC的第三方动态库,除非做如下设定:

 

假设 自己定义的第三方动态库存放于: c:/3rdlibs

修改注册表:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/AssemblyFolders

在这个项目下加入一个项,并指向 c:/3rhlibs

 

现在可以在我们的web项目中引用第三方的GAC库了。

 

3.重新编译web,调试:

  • 第一个问题:配置错误

 


 

显然我们的web项目没有找到已经存放在 GAC 中的库。放入GAC以前这些库是跟随编译输出到 web/bin 目录下的。现在自动定位不到,我们可以修改 web.config 来指定库的引用方式:

 

 

再次编译调试运行

 

  • 第二个错误:编译错误

这次是一个编译错误,但是错误的信息并不清晰,暂时无法定位到具体内容,修改 web.config, 增加一个配置节(compilation),如下

 

 

再次调试:

 

 

这个错误信息最重要:

编译器错误信息: CS0012: 类型“Castle.Windsor.IContainerAccessor”在未被引用的程序集中定义。必须添加对程序集“Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc”的引用。

 

显然,我们在修改 web.config之后,iis服务重启了当前的web项目,并且对它进行了编译,首先被编译的就是 global.asax.cs, 其中某个初始化的变量,也可能是一个静态的变量,调用了 Castle.Windsor,并且 csc 找不到这个 Castle.Windsor ,真是一个麻烦的过程。

 

第一个尝试: 在web项目中的引用部分,对 Castle.Windsor 做设定,原来直接引用动态库的时候是同步输出到 web/bin 下的,引用 GAC之后此输出就取消了,现在重新设定为“复制到本地”。当然,设定后的编译会把此文件:Castle.Windsor输出到 web/bin下,如此一来,调试也可以通过了,因为他找到了这个动态库。

 

但是这并没有解除我们的疑惑,那就是, <runtime><assemblyBinding>... ...</assemblyBinding><runtime> 中定义的Assembly并不对编译过程发生作用,那么在编译过程中要用到的是那个节呢?

 

第二个尝试:想到第一个尝试中的 (compilation) 节,查看msdn的说明,知道 <compilation>中有 <assemblies>的定义,增加配置如下:

 

然后取消web项目中对 Castle.Windsor 的 “复制到本地”,重新编译运行。

 

All are Working Fine.

 

(原文链接 http://ddbiz.com/?p=195)

 到这里我们已经成功的把所以第三方引用的动态库放入到 GAC 中了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值