国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 03:59:49
字體:
來源:轉載
供稿:網友
因為服務器的性能有限,發現自從使用了 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 中了
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 社旗县| 中山市| 莱州市| 金华市| 平舆县| 兰考县| 武宁县| 长兴县| 平度市| 浦北县| 南陵县| 大荔县| 辉南县| 萍乡市| 成武县| 竹溪县| 绥德县| 黄浦区| 苍溪县| 古蔺县| 滨州市| 镇赉县| 乡城县| 义乌市| 麻江县| 元氏县| 名山县| 平潭县| 漾濞| 同江市| 怀柔区| 五台县| 旌德县| 灯塔市| 北票市| 通州区| 江孜县| 清水县| 哈尔滨市| 固安县| 衡阳县|