2017-02-01 18 views
-1

基本的に私は2つのプロジェクトを持っています。それをプロジェクトAとプロジェクトBと名付けましょう。実行時に別のWinformプロジェクトで異なる設定ファイルを使用することはできますか?

両方のプロジェクトがWinFormアプリケーションです。

プロジェクトAからプロジェクトBのフォームを呼び出すことがあります。どちらのプロジェクトも接続文字列、ビジネスレイヤ、サービス、モデルの実装が異なるため、これらはすべてプロジェクトごとにapp.configで設定されています。もちろん、別のコンテンツ。

つまり、プロジェクトAには独自のapp.configがあります。プロジェクトBには独自のapp.configがあります。

私はwinform/winappプロジェクトで、実行時にapp.configを使用するか、むしろ切り替える必要があります。これは可能ですか?

問題は、ソリューション全体を起動したとき(プロジェクトAがスタートアップとして設定されている)、プロジェクトAのapp.configがロードされるという問題です。今私はプロジェクトBのwinformsを呼び出すたびに、プロジェクトBのapp.configを使用したいと思います。

入力いただきありがとうございます!

+0

実行可能ファイルの設定ファイルには、実行する*すべて*の設定が必要です。各プロジェクトの設定セクションには独自の名前空間があり、最終的な設定ファイルに含めることができます。 –

+0

両方のプロジェクトを起動して、WCF(?)経由で通信できるようにすることができます –

+0

しかし、私のプロジェクトは単純なwinformアプリケーションです。このためにwcfを作成する必要はありますか? –

答えて

1

あなたは実行時に設定ファイルを変更したい場合は、このコードは私のために完璧に動作し、まず、あなたの設定ファイルを変更するために呼び出すクラスを作成します。

public abstract class AppConfig : IDisposable 
{ 
    public static AppConfig Change(string path) 
    { 
     return new ChangeAppConfig(path); 
    } 

    public abstract void Dispose(); 

    private class ChangeAppConfig : AppConfig 
    { 
     private readonly string oldConfig = 
      AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString(); 

     private bool disposedValue; 

     public ChangeAppConfig(string path) 
     { 
      AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path); 
      ResetConfigMechanism(); 
     } 

     public override void Dispose() 
     { 
      if (!disposedValue) 
      { 
       AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig); 
       ResetConfigMechanism(); 


       disposedValue = true; 
      } 
      GC.SuppressFinalize(this); 
     } 

     private static void ResetConfigMechanism() 
     { 
      typeof(ConfigurationManager) 
       .GetField("s_initState", BindingFlags.NonPublic | 
             BindingFlags.Static) 
       .SetValue(null, 0); 

      typeof(ConfigurationManager) 
       .GetField("s_configSystem", BindingFlags.NonPublic | 
              BindingFlags.Static) 
       .SetValue(null, null); 

      typeof(ConfigurationManager) 
       .Assembly.GetTypes() 
       .Where(x => x.FullName == 
          "System.Configuration.ClientConfigPaths") 
       .First() 
       .GetField("s_current", BindingFlags.NonPublic | 
             BindingFlags.Static) 
       .SetValue(null, null); 
     } 
    } 
} 

次に、あなたのプログラムでこれを呼び出すために、あなたはこれを行うことができます。

using (AppConfig.Change(@"D:\app.config")) 
     { 
      //TODO: 
     } 
0

は、あなたの質問が以前に頼まれました:

は、最初のプロジェクトではapp.configへのリンクを追加するためには、Visual Studioのソリューションエクスプローラから「既存項目の追加]メニューを使用してください。詳細はこのリンクで指定されています

How to Share App.config?

+0

これは、問題のことではありません。それはまったく助けにならない –

関連する問題