web-dev-qa-db-ja.com

クラスライブラリのapp.config

VS2008ウィザードによってクラスライブラリ用に生成されたapp.configファイルが表示されません。私の研究では、アプリケーションにはapp.configが1つしか存在しないことがわかりました。

App.configをクラスライブラリに手動で追加するのは悪いことですか、またはクラスライブラリでapp.configの目的に役立つ他のメソッドがありますか?

App.configファイル内にlog4net構成情報を保存する必要があります。

64
logeeks

通常はnotを追加する必要がありますapp.configファイルをクラスライブラリプロジェクトに。痛みを伴う曲げやねじれがなければ使用できません。 hurtライブラリプロジェクトではありません。まったく何もしません。

代わりに、ライブラリを使用しているアプリケーションを構成します。必要な構成情報はそこに行きます。ライブラリを使用する可能性のあるアプリケーションごとに要件が異なる可能性が高いため、これも実際には理にかなっています。

82
Andrew Barber

この答えがまだ与えられていない理由がわかりません:

通常、同じライブラリの異なる呼び出し元は異なる構成を使用します。これは、構成がクラスライブラリではなくexecutableアプリケーションに存在する必要があることを意味します。

クラスライブラリプロジェクト内にapp.configを作成できます。ライブラリ内に作成するアイテムのデフォルト設定が含まれます。たとえば、クラスライブラリ内でEntity Frameworkモデルを作成すると、接続文字列が含まれます。

ただし、これらの設定は、ライブラリを呼び出す実行可能アプリケーションでは使用されません。代わりに、これらの設定はlibrary.dll.configファイルから発信者のapp.configまたはweb.configにコピーされ、発信者と発信者がいる環境に固有になるように変更される場合があります展開されました。

これが、1日目以降の.NETの動作です。

43
John Saunders

ジョン、あなたの質問に正しく答えられなかった多くの意見が出されました。

私は私の意見を述べ、それからあなたが要求したことを正確に行う方法を教えます。

アセンブリが独自の構成ファイルを作成できなかった理由はわかりません。アトミックの最初のレベル(実際の単語ですか?)がアプリケーションレベルにあるのはなぜですか?ソリューションレベルではなぜですか?それはarbitrary意的で、最も推測しやすい決定であり、そのため、意見です。ロギングライブラリを記述し、そのための構成ファイルを含めたい場合、それはグローバルに使用されますが、組み込みの設定機能に接続できないのはなぜですか?私たちは皆それをやった...他の開発者に「強力な」機能を提供しようとした。どうやって?本質的に制限に変換される仮定を行うことにより。これは、MSが設定フレームワークで行ったこととまったく同じであるため、少し「だます」必要があります。

質問に直接答えるには、構成ファイルを手動で追加し(xml)、ライブラリに一致するように名前を付け、「config」拡張子を含めます。例:

MyDomain.Mylibrary.dll.Config

次に、ConfigurationManagerを使用してファイルを読み込み、設定にアクセスします。

string assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).AbsolutePath;
Configuration cfg = ConfigurationManager.OpenExeConfiguration(assemblyPath);
string result = cfg.AppSettings.Settings["TEST_SETTING"].Value;

アプリの構成ファイルを明示的に選択した場合でも、これによりmachine.config階層が完全にサポートされることに注意してください。つまり、設定が存在しない場合、より高い解像度になります。設定はmachine.configエントリも上書きします。

35
Todd Beaulieu

実際、実装しているクラスライブラリは、それを使用しているアプリケーション内のapp.configから情報を取得しているので、クラスライブラリの構成を実装する最も正しい方法は、 VSの.netは、アプリケーションでapp.configを準備し、ライブラリ構成など、消費するすべてを構成します。

私はlog4netを少し使ってみましたが、アプリケーションを準備した人には、mainapp.config内にlog4netの設定セクションが常にあることがわかりました。

この情報がお役に立てば幸いです。

また、見つけた解決策についてコメントを投稿してください。

編集:

次のリンクには、log4netのセクションを含むapp.configがあります。

http://weblogs.asp.net/tgraham/archive/2007/03/15/a-realistic-log4net-config.aspx

6
Amedio

クラスライブラリを使用しながら、log4Netを使用してプロジェクトロギングを設定する場合、設定ファイルは実際には必要ありません。クラスでlog4netロガーを構成し、そのクラスをライブラリとして使用できます。

Log4netはそれを設定するためのすべてのオプションを提供します。

以下のコードを見つけてください。

public static void SetLogger(string pathName, string pattern)
        {
            Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

            PatternLayout patternLayout = new PatternLayout();
            patternLayout.ConversionPattern = pattern;
            patternLayout.ActivateOptions();

            RollingFileAppender roller = new RollingFileAppender();
            roller.AppendToFile = false;
            roller.File = pathName;
            roller.Layout = patternLayout;
            roller.MaxSizeRollBackups = 5;
            roller.MaximumFileSize = "1GB";
            roller.RollingStyle = RollingFileAppender.RollingMode.Size;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            MemoryAppender memory = new MemoryAppender();
            memory.ActivateOptions();
            hierarchy.Root.AddAppender(memory);

            hierarchy.Root.Level = log4net.Core.Level.Info;
            hierarchy.Configured = true;
      }

XmlConfigurator.Configure(new FileInfo( "app.config"))を呼び出す代わりに、希望するパスとパターンでSetLoggerを直接呼び出して、Global.asaxアプリケーションの開始関数でロガーを設定できます。

そして、以下のコードを使用してエラーを記録します。

        public static void getLog(string className, string message)
        {
            log4net.ILog iLOG = LogManager.GetLogger(className);
            iLOG.Error(message);    // Info, Fatal, Warn, Debug
        }

次のコードを使用することにより、アプリケーションweb.configまたはライブラリのapp.config内に単一行を記述する必要はありません。

6
Rahul

実際、まれに、app.configを(手動で追加して)クラスライブラリに保存し、 OpenExeConfiguration で解析できます。

 var fileMap =
    new ExeConfigurationFileMap {ExeConfigFilename = 
    @"C:\..somePath..\someName.config"};
 System.Configuration.Configuration config =
    ConfigurationManager.OpenMappedExeConfiguration(fileMap, 
    ConfigurationUserLevel.None);

あなたは本当にこれの本当の必要性を見積もるべきです。抽象データには最適なソリューションではありませんが、「構成セクション」は非常に便利です!!

たとえば、チャンネルファクトリTに基づいてUnityコンテナとインジェクションファクトリを使用するだけで、メタデータなしで分離されたN層WCFアーキテクチャを整理しました。 clientsectionからエンドポイントを読み取り、1か所で簡単に追加/変更します。

4
Roma Borodov

トレーサー/ロガーを使用している場合は、App.configtestsクラスライブラリに追加します。 それ以外の場合は何もログに記録されません TestDriven.Netなどのテストランナーを介してテストを実行する場合。

たとえば、プログラムでTraceSourceを使用しますが、テストクラスライブラリにトレース/ログ構成のApp.configファイルを追加しない限り、テストの実行では何も記録されません。 。

それ以外の場合、App.configをクラスライブラリに追加しても何も実行されません。

App.configを手動で作成しない場合の答えは、Visual Studioプロジェクトのプロパティ/設定タブです。

設定を追加して保存すると、app.configが自動的に作成されます。この時点で、設定に対応するプロパティを含む{yourclasslibrary。Properties}名前空間に一連のコードが生成されます。設定自体は、app.configのapplicationSettings設定に配置されます。

 <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="ClassLibrary.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
</configSections>
<applicationSettings>
    <ClassLibrary.Properties.Settings>
        <setting name="Setting1" serializeAs="String">
            <value>3</value>
        </setting>
    </BookOneGenerator.Properties.Settings>
</applicationSettings>

Setting1 = 3というApplicationスコープ設定を追加した場合、Setting1というプロパティが作成されます。これらのプロパティはバイナリのコンパイル部分になり、開発時に指定した値に設定されるDefaultSettingValueAttributeで装飾されます。

     [ApplicationScopedSetting]
    [DebuggerNonUserCode]
    [DefaultSettingValue("3")]
    public string Setting1
    {
        get
        {
            return (string)this["Setting1"];
        }
    }

したがって、対応する設定がランタイム構成ファイルに存在しない場合、クラスライブラリコードでこれらのプロパティを使用するように、デフォルト値を使用するようにフォールバックします。そうすれば、設定エントリがないためにアプリケーションがクラッシュすることはありません。これは、これらの機能がどのように機能するのかわからないときに初めて混乱することです。さて、デプロイされたライブラリで独自の新しい値を指定し、デフォルトの設定値を使用しないようにする方法を自問していますか?

これは、実行可能ファイルのapp.configを適切に構成すると発生します。 2つのステップ。 1.そのクラスライブラリの設定セクションがあることを認識し、2。少し修正して、クラスライブラリの構成ファイルを実行可能構成に貼り付けます。 (クラスライブラリの構成ファイルを外部に保持し、実行可能ファイルの構成から参照するだけのメソッドがあります。

そのため、クラスライブラリのapp.configを使用できますが、親アプリケーションと適切に統合しないと役に立ちません。ここで私が先ほど書いたものを参照してください: link

2
Mircea Ion

クラスライブラリプロジェクトをソリューションに追加するとき、app.configファイルは自動的に追加されません。

私の知る限り、そのように手動で行うことに関する反論はありません。これは一般的な使い方だと思います。

Log4Net構成については、構成をapp.configに入れる必要はありません。プロジェクトに専用のconfファイルとapp.configファイルを同時に含めることができます。

このリンク http://logging.Apache.org/log4net/release/manual/configuration.html は、両方の方法の例を提供します(app.configのセクションとスタンドアロンlog4net confファイル)

1
Bruno

Properties.Settingsを使用して、ConnectionStringsなどの値をクラスライブラリ内に格納することをお勧めします。これは、たとえばテーブルアダプタを追加しようとしたときに、Visual Studioからの提案によってすべての接続文字列が格納される場所です。 ここに画像の説明を入力

そして、clasライブラリ内のすべての場所でこのコードを使用してアクセスできます

var cs=  Properties.Settings.Default.[<name of defined setting>];
0
sishanov