C#4.0で記述されたASP.NETWebアプリケーションがあります。アプリケーションは、独自の構成ファイルに付属するクラスライブラリを参照します。実行時に、クラスライブラリは次のコードと同様のコードを使用してこの特定の構成をロードします。
var exeConfigPath = this.GetType().Assembly.Location;
var config = ConfigurationManager.OpenExeConfiguration(exeConfigPath);
これが行われるのは、ライブラリがアプリケーション構成ではなく、バンドルされた構成をロードする必要があるためです。アプリケーション構成は、ライブラリの設定に関係してはならず、それらを変更できないようにする必要があります。
さて、この概念が機能するために実行する必要がある他のいくつかのことがあります。ライブラリの構成ファイルのビルド操作をプロパティウィンドウでコンテンツとして設定し、コピーをCopy Always
またはに設定する必要がありCopy If Newer
ます。これまでのところ、ファイルは自動的にクラスライブラリのbinディレクトリとWebアプリケーションのbinディレクトリの両方に配置され、からに正しく名前が変更さApp.config
れCustomLibrary.dll.config
ます(想定どおり、ライブラリのdllはCustomLibrary.dllです)。
今、私は2つの問題に直面しています。
1)Webアプリケーションをファイルシステムの場所(IISでマップされている)に公開すると、公開されたアプリのbinフォルダーのようにCustomLibrary.dll.config
表示されます。App.config
OK-予想される規則に一致するようにクラスライブラリプロジェクトで名前を変更します-そして問題は解決しました。
2)公開されている場合でも、IISはアプリケーションを再度コンパイルし、ASP.NET一時ファイルに保存します。参照される各アセンブリ専用のフォルダを備えた豪華なディレクトリ構造があります。CustomLibrary.dllに対応するフォルダーには、構成ファイルが含まれていません。this.GetType().Assembly.Location
は一時フォルダへのパスを返すため、アプリケーションは構成のロードに失敗し、正常にクラッシュします。
クラスライブラリに構成を含めるパターンを保持し、Webアプリケーションで機能させる必要があります。.configをtempフォルダーに手動でコピーすると、アプリは機能しますが、ランダムな名前のフォルダーに手動でコピーするのは本当に嫌いです。
IISが一時フォルダーを使用しないようにする方法、または構成ファイルに沿ってコピーする方法はありますか?私が直面している問題は、構成ファイルが配置されているときにアプリケーションが期待どおりに機能するため、概念ではなく構成に関連していると思います。構成ファイルへのハードコードされた物理パスを使用することも避けたいと思います。
編集:
わかりやすくするために、何を、なぜ達成したいのかを指摘します。ライブラリとWebプロジェクトは別々の製品として開発されるという考え方です。ライブラリの構成にはユーザーまたはアプリケーション固有の情報がないため、さまざまな使用シナリオで変更されることはありません。また、エンドアプリケーションではなく、クラスライブラリの機能に固有のものです。ライブラリの構成情報をライブラリ内にバンドルしておくことは理にかなっています(Javaと同様に、Springコンテキストのxmlファイルまたはプロパティファイルがライブラリのjarにバンドルされます)。コンシューマーアプリケーションの各アプリ/ウェブ構成の構成をコピーする必要がないようにしたいと思います。コンシューマーアプリケーションがサードパーティによって開発されている場合がありますが、そして、私は彼らが私のものが機能するために彼らの構成を正しく行うことに依存したくありません。繰り返しますが、ここでの唯一の問題は、構成ファイルが適切な場所にコピーされていないことです。