2011-01-05 13 views
6

私は以下のプロジェクトがあります。.NETの.config HELL

  1. MVCを
  2. コンソールアプリケーション
  3. クラスライブラリが
  4. Windowsフォームアプリケーション
  5. COMライブラリ

これらのアプリケーションはすべて単一の構成ファイルを使用します。私が理解する限り、app.configファイルは、Webプロジェクト用のウィンドウ、コンソールアプリケーション、クラスライブラリ用です。

これらのすべてのプロジェクトで同じ設定にする必要があります。マシン構成ファイルを使用することをお勧めしますが、常にアクセスできるとは限りません。そのため、構成ファイルは私たちのソリューション内に存在する必要があります。

設定ファイルがどのようにビルドされるのか完全に理解していません。現在、私は次のような単純なプロジェクトを書いています。

  1. サービス設定ファイルのために保存するクラスライブラリ。 Aはこれを反映させようとしました。
  2. クラスライブラリからapp.configを読み込むWindowsアプリケーションです。

私は、次のコードを実行すると、私はテスト値で設定ファイルを取得することを期待:

_applicationSettings = ConfigurationManager.OpenExeConfiguration(
        System.Reflection.Assembly.GetAssembly(typeof(WCSConfiguration)).Location 
        ).AppSettings;  

私が代わりに取得すると、空のアプリケーションの設定ファイルです。

クラスライブラリには、次のApp.configファイルを持っている:私は、現在実行中のコードの集合を返すことを期待.GetExecutingAssembly()メソッドを使用してみましたが

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
    <add key="TestTextKey" value="TestTextValue"/> 
    </appSettings> 
</configuration> 

。これは機能しませんでしたが、代わりにWindowsアプリケーションのアセンブリが返されました。

GetAssembly(type(WCSConfiguration))が正しいアセンブリを返しましたが、設定ファイルがbin/debugディレクトリにありませんでした。

私は、何か根本的に間違っているか、マイクロソフトがこれを十分に柔軟にしていないと感じています。私も説明のためにMSDNを検索しようとしましたが、これはよくIMOには書かれていません。

COMライブラリで設定ファイルを使用できるかどうかわからないため、私もCOMを太字にしました。まず、私は他のプロジェクトを働かせたいと思っています。

私はこれが多くの情報であることを理解しています。どんな助けでも大変に感謝しています。以前はレジストリの使用を選択しましたが、主にレジストリへのアクセスがいくつかのシナリオでは利用できないため、これは厄介なものでした。さらに、我々は今、アプリケーションの複数のバージョンがあり、枝の切り替えは時間半の仕事です:(

はあなたに

編集ありがとう:私はApp.configファイルにDLLのconfigセクションを追加した場合

をこれは、これらの設定がそのアプリケーションからのみ利用可能であることを意味します。私が間違っている場合、私を修正してください。私が提供した例は縮小版です。合計で約10のウィンドウアプリケーション、1つのMVCプロジェクト、ライブラリはそのすべてをその構成を使用する必要があります。

構成設定はほとんどが接続文字列で、データベースには属していないルックアップ値やその他のマイナーな設定はほとんどありません。現時点での主な関心事は、接続文字列です。各リリースが異なるデータベースを指しているアプリケーションのマイナーリリースはほとんどありません。

私はこの問題を解決したいと思っています。これは、オンラインで公開することができ、同じ問題を抱えている他の人々が時間を費やさないようにするうえで有効な解決策です。

IMO: 独自の設定ファイルの場所を保存するには、App.configとWeb.configの両方を使用します。

構成を処理するための読み取りと書き込みのコンフィグレーションとDLL用のシンプルなXMLシリアライザを作成します。

COMオブジェクトは長い話題であり、COM DLLではApp.configもWeb.configも使用できないため、「ハック」が実装されていました。

+0

http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.openmappedexeconfiguration.aspxを使用して任意の設定ファイルを開こうとしましたか?あなたが指し示すことができる共有場所に共有設定ファイルがあると思います。 –

+0

私はこれを使ってみました。 OpenMappedExeConfigurationは、クラスライブラリの設定を返すと思ったOpenMappedMachineConfigurationよりも、実行可能ファイルに対して機能しますが、どちらも機能しません。 –

+0

OpenMappedExeConfigurationはすべての種類の設定で動作しますが、実行可能ファイルで動作することを意味していませんか?私は毎日私のwebapplicationsの設定ファイルを開くためにそれを使用する –

答えて

4

ConfigurationManager.OpenExeConfigurationには、実行可能ファイルではなくconfigファイルのファイル名を渡す必要があります。

実行ファイルのパスに.configを追加する必要があります。 exeアセンブリを入手するにはAssembly.GetEntryAssemblyを使用してください。

あなたが同じ.NETプロセス内のすべてではありません複数のコード間で共有したい構成設定を持っている場合は、私がお勧めします:

  • 自分のmyStuff.configでそれらを置きます。
  • .NETコードではmyStuff.configを開いてアクセスするにはConfigurationManager.OpenExeConfigurationを使用します。
  • 非.NETコードでは、XMLパーサーを使用して設定を読み込んで読み込む必要があります。構成構造が非常に複雑でない限り、これはカプセル化するのが難しいはずはありません。
  • この設定を.NETアプリケーション用に共有する各アプリケーションのapp.configにパスをmyStuff.configに設定します。 (非.NETアプリケーションではなく、そのアプリケーションで何が動作するかによって異なります。)

設定構造が同じであるが設定がアプリケーションごとの別のアプローチは、カスタム構成セクションです。

+0

私は今これを行かせます。 bin/debugディレクトリにApp.configがあり、同じディレクトリにWindowsFormApplication1.exe.configがあります。私はクラスライブラリのためのConfigurationLib.dll.configを持っていると思うが、そこにはない。 –

1

いくつかの一般的な点 - dllの設定ファイルを使用するのではなく、app.configファイルにdllの設定セクションを追加してください。 app.configはビルド時に実際に.exe.configに名前が変更されるため、その名前のファイルが使用可能であることを確認する必要があります。

また、アプリケーションを設定するためにデフォルトの設定ローディングメカニズムを使用することに制約はありません。独自の構成クラスを作成し、XMLシリアル化を使用してデシリアライズおよび構成を自由に行うことができます。

+0

こんにちは。 dllの設定セクションをapp.configに追加すると、これらの設定はそのアプリケーションからのみ使用可能になります。私はこれを言うのは正しいですか?私が提供した例は縮小版です。合計で約10のWindowsアプリケーション、1つのMVCプロジェクト、およびクラスライブラリのすべてがその構成を使用する必要があります。 –

+3

私は真剣にデフォルトの.netの仕組みを使わないことを検討し、自分のXMLシリアライズされた設定クラスから設定情報を提供できるスタンドアロンの設定ライブラリを作成します。 –

+0

つまり、.NET 2+では、デフォルト以外の設定ファイルにリダイレクトすることもできます。たとえば、MSDNのConfigurationManager.OpenMappedExeConfigurationを参照してください。これは、.NETアプリケーションの場合、少なくとも1つの設定ファイルにマッピングされます。 –