-
サーバーのパフォーマンスが限られているため、Castle + Nhibernate を使用して以来、Web サイト更新後のサーバーの再コンパイル プロセスが特に長く、公開された Web プログラムもコンパイルされているにもかかわらず、1 分以上かかる場合があります。 Web で使用される動的ライブラリは次のとおりです。
Castle.Core.dll
Castle.DynamicProxy2.dll
Castle.Facility.AutomaticTransactionManagement.dll
Castle.Facility.NHibernateIntegration.dll
Castle.MicroKernel.dll
Castle.Services.Transaction.dll
城.ウィンザー.dll
FredCK.FCKeditorV2.dll
Iesi.Collections.dll
ログ4ネット.dll
MySql.Data.dll/System.Data.SQLite.dll
NHibernate.dll
URLRewritingNet.UrlRewriter.dll
Web プロジェクトが更新され、再コンパイル後に生成された web.dll がサーバーにアップロードされるたびに、サーバー w3p が再起動され、Web ディレクトリ内のファイルが csc 処理されます。このプロセス全体は非常に長くて耐えられません。
[何か良い提案はあるでしょうか]
その後、上記の動的ライブラリを 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 を直接参照します。
ここで発生するもう 1 つの問題は、次の設定が行われていない限り、vs2005 が GAC で定義されたサードパーティのダイナミック ライブラリを参照できないことです。
定義したサードパーティのダイナミック ライブラリが c:3rdlibs に保存されていると仮定します。
レジストリを変更します: HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkAssemblyFolders
このプロジェクトの下に項目を追加し、c:3rhlibs をポイントします。
これで、Web プロジェクトでサードパーティの GAC ライブラリを参照できるようになりました。
3. Web を再コンパイルしてデバッグします。
最初の問題: 設定エラー
プレーンコピーをクリップボードプリントに表示しますか?
構成エラー
説明: この要求を処理するために必要な構成ファイルの処理中にエラーが発生しました。以下の特定のエラーの詳細を確認し、構成ファイルを適切に変更してください。
パーサー エラー メッセージ: ファイルまたはアセンブリ 'UrlRewritingNet.UrlRewriter'、またはその依存関係の 1 つを読み込むことができません。指定されたファイルが見つかりません。 (web.config 50行目)
ソースエラー:
48行目:
49 行目: <httpModules>
50 行目: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
ソースファイル: web.config 行数: 50
構成エラーの説明: この要求を処理するために必要な構成ファイルの処理中にエラーが発生しました。以下の特定のエラーの詳細を確認し、構成ファイルを適切に変更してください。
パーサー エラー メッセージ: ファイルまたはアセンブリ 'UrlRewritingNet.UrlRewriter'、またはその依存関係の 1 つを読み込むことができません。指定されたファイルが見つかりません。 (web.config 50行目)
ソースエラー:
48行目:
49 行目: <httpModules>
50 行目: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
ソースファイル: web.config 行数: 50
明らかに、私たちの Web プロジェクトは GAC に既に保存されているライブラリを見つけられませんでした。これらのライブラリは GAC に組み込まれる前にコンパイルされ、web/bin ディレクトリに出力されます。自動的に見つけることができないので、web.config を変更してライブラリの参照方法を指定できます。
プレーンコピーをクリップボードプリントに表示しますか?
<構成>
...
<ランタイム>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly PartialName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly constantName="Castle.Windsor" fullName="Castle.Windsor、Version=1.0.3.0、Culture=neutral、PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly constantName="Castle.MicroKernel" fullName="Castle.MicroKernel、Version=1.0.3.0、Culture=neutral、PublicKeyToken=407dd0808d44fbdc"/>
……
</assemblyBinding>
</ランタイム>
</設定>
<構成>
...
<ランタイム>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly PartialName="log4net" fullName="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
<qualifyAssembly constantName="Castle.Windsor" fullName="Castle.Windsor、Version=1.0.3.0、Culture=neutral、PublicKeyToken=407dd0808d44fbdc"/>
<qualifyAssembly constantName="Castle.MicroKernel" fullName="Castle.MicroKernel、Version=1.0.3.0、Culture=neutral、PublicKeyToken=407dd0808d44fbdc"/>
……
</assemblyBinding>
</ランタイム>
</設定>
コンパイル、デバッグ、再実行
2 番目のエラー: コンパイル エラー
プレーンコピーをクリップボードプリントに表示しますか?
「/」アプリケーションでサーバー エラーが発生しました。
-------------------------------------------------- ----------------------------------
コンパイルエラー
説明: この要求を処理するために必要なリソースのコンパイル中にエラーが発生しました。以下の具体的なエラーの詳細を確認し、ソースコードを適切に修正してください。
コンパイラ エラー メッセージ: CS0012: 型 'Castle.Windsor.IContainerAccessor' は参照されていないアセンブリで定義されています。アセンブリ「Castle.Windsor、Version=1.0.3.0、Culture=neutral、PublicKeyToken=407dd0808d44fbdc」への参照を追加する必要があります。
ソースエラー:
[関連するソース行はありません]
ソース ファイル: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 行: 133
「/」アプリケーションでサーバー エラーが発生しました。
-------------------------------------------------- ----------------------------------
コンパイル エラーの説明: この要求を処理するために必要なリソースのコンパイル中にエラーが発生しました。以下の具体的なエラーの詳細を確認し、ソースコードを適切に修正してください。
コンパイラ エラー メッセージ: CS0012: 型 'Castle.Windsor.IContainerAccessor' は参照されていないアセンブリで定義されています。アセンブリ「Castle.Windsor、Version=1.0.3.0、Culture=neutral、PublicKeyToken=407dd0808d44fbdc」への参照を追加する必要があります。
ソースエラー:
[関連するソース行はありません]
ソース ファイル: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_Web_default.aspx.zzzzzzz.aaaaaaaa.0.cs 行: 133
今回はコンパイルエラーですが、エラーメッセージが明確ではなく、当面は具体的な内容が見つからないため、以下のように web.config を修正し、設定セクション (コンパイル) を追加します。
プレーンコピーをクリップボードプリントに表示しますか?
<構成>
<システム.ウェブ>
……
<コンパイルデバッグ="true" />
……
</system.web>
</設定>
<構成>
<システム.ウェブ>
……
<コンパイルデバッグ="true" />
……
</system.web>
</設定>
再度デバッグします:
プレーンコピーをクリップボードプリントに表示しますか?
コンパイルエラー
説明: この要求を処理するために必要なリソースのコンパイル中にエラーが発生しました。以下の具体的なエラーの詳細を確認し、ソースコードを適切に修正してください。
コンパイラ エラー メッセージ: CS0012: 型 'Castle.Windsor.IContainerAccessor' は参照されていないアセンブリで定義されています。アセンブリ「Castle.Windsor、Version=1.0.3.0、Culture=neutral、PublicKeyToken=407dd0808d44fbdc」への参照を追加する必要があります。
ソースエラー:
134 行目: }
135行目:
136 行目: protected ASP.global_asax ApplicationInstance {
137行目: {を取得
138 行目: return ((ASP.global_asax)(this.Context.ApplicationInstance));
ソース ファイル: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_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行目: {を取得
138 行目: return ((ASP.global_asax)(this.Context.ApplicationInstance));
ソース ファイル: c:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET FilesrootxxxxxxyyyyyyyyApp_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 であり、静的変数である可能性があります。 Windsor が呼び出されますが、csc はこの Castle.Windsor を見つけることができません。これは非常に面倒なプロセスです。
最初の試み: Web プロジェクトの参照セクションで、Castle.Windsor を設定します。当初、動的ライブラリが直接参照された場合、GAC が参照された後、この出力はキャンセルされました。 . 「ローカルにコピー」に設定します。もちろん、設定後のコンパイルでは、Castle.Windsor というファイルが web/bin に出力されます。このようにして、この動的ライブラリが見つかったため、デバッグもパスします。
しかし、これでは疑問が解消されません。つまり、<runtime><assemblyBinding>... ...</assemblyBinding><runtime> で定義されたアセンブリはコンパイル プロセスに影響を与えないため、コンパイル プロセス中に使用する必要があります。どのセクションですか?
2 回目の試行: 最初の試行の (コンパイル) セクションを思い出し、msdn の説明を確認して、<compilation> に <assemblies> の定義があることを確認します。次のように構成を追加します。
プレーンコピーをクリップボードプリントに表示しますか?
<コンパイルデバッグ="false">
<アセンブリ>
<add Assembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</アセンブリ>
</コンパイル>
<コンパイルデバッグ="false">
<アセンブリ>
<add Assembly="Castle.Windsor, Version=1.0.3.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc"/>
</アセンブリ>
</コンパイル>
次に、Web プロジェクトの Castle.Windsor の「ローカルにコピー」をキャンセルし、再コンパイルして実行します。
すべて正常に動作しています。
この時点で、サードパーティが参照するすべての動的ライブラリを GAC に正常に配置することができました。