分享
 
 
 

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

王朝学院·作者佚名  2009-12-05
窄屏简体版  字體: |||超大  

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

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,调试:

第一个问题:配置错误

view plaincopy to clipboardprint?

配置错误

说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。

分析器错误信息: 未能加载文件或程序集“UrlRewritingNet.UrlRewriter”或它的某一个依赖项。系统找不到指定的文件。 (web.config line 50)

源错误:

行 48:

行 49: <httpModules>

行 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>

源文件: web.config 行: 50

配置错误

说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。

分析器错误信息: 未能加载文件或程序集“UrlRewritingNet.UrlRewriter”或它的某一个依赖项。系统找不到指定的文件。 (web.config line 50)

源错误:

行 48:

行 49: <httpModules>

行 50: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>

源文件: web.config 行: 50

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

view plaincopy to clipboardprint?

<configuration>

......

<runtime>

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

<qualifyAssembly partialName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>

<qualifyAssembly partialName="Castle.Windsor" fullName="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>

<qualifyAssembly partialName="Castle.MicroKernel" fullName="Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>

... ...

</assemblyBinding>

</runtime>

</configuration>

<configuration>

......

<runtime>

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

<qualifyAssembly partialName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>

<qualifyAssembly partialName="Castle.Windsor" fullName="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>

<qualifyAssembly partialName="Castle.MicroKernel" fullName="Castle.MicroKernel, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>

... ...

</assemblyBinding>

</runtime>

</configuration>

再次编译调试运行

第二个错误:编译错误

view plaincopy to clipboardprint?

“/”应用程序中的服务器错误。

--------------------------------------------------------------------------------

编译错误

说明: 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。

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

源错误:

[没有相关的源行]

源文件: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\xxxxxx\yyyyyyyy\App_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 行: 133

“/”应用程序中的服务器错误。

--------------------------------------------------------------------------------

编译错误

说明: 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。

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

源错误:

[没有相关的源行]

源文件: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\xxxxxx\yyyyyyyy\App_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 行: 133

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

view plaincopy to clipboardprint?

<configuration>

<system.web>

... ...

<compilation debug="true" />

... ...

</system.web>

</configuration>

<configuration>

<system.web>

... ...

<compilation debug="true" />

... ...

</system.web>

</configuration>

再次调试:

view plaincopy to clipboardprint?

编译错误

说明: 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。

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

源错误:

行 134: }

行 135:

行 136: protected ASP.global_asax ApplicationInstance {

行 137: get {

行 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));

源文件: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\xxxxxx\yyyyyyyy\App_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 行: 136

编译错误

说明: 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。

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

源错误:

行 134: }

行 135:

行 136: protected ASP.global_asax ApplicationInstance {

行 137: get {

行 138: return ((ASP.global_asax)(this.Context.ApplicationInstance));

源文件: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\xxxxxx\yyyyyyyy\App_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 行: 136

这个错误信息最重要:

编译器错误信息: 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>的定义,增加配置如下:

view plaincopy to clipboardprint?

<compilation debug="false">

<assemblies>

<add assembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>

</assemblies>

</compilation>

<compilation debug="false">

<assemblies>

<add assembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>

</assemblies>

</compilation>

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

All are Working Fine.

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有