13

モジュールをアプリケーションに動的にロードしようとしていますが、それぞれに個別のapp.configファイルを指定したいと思います。

メインアプリに次のapp.config設定があるとします。

<appSettings>
  <add key="House" value="Stark"/>
  <add key="Motto" value="Winter is coming."/>
</appSettings>

そして、私が使用してロードするライブラリ用の別のものAssembly.LoadFrom

<appSettings>
  <add key="House" value="Lannister"/>
  <add key="Motto" value="Hear me roar!"/>
</appSettings>

両方のライブラリには、次のメソッドを使用して同じインターフェイスを実装するクラスがあります。

public string Name
{
    get { return ConfigurationManager.AppSettings["House"]; }
}

Nameそして、メインクラスとロードされたアセンブリクラスの出力の両方からの十分な呼び出しを確認してStarkください。

メインアプリに独自のapp.configを使用させ、ロードされた各アセンブリがそれらを使用するようにする方法はありますか?設定ファイルの名前は出力で異なるので、それは可能だと思います。

4

3 に答える 3

15

わかりました、これが私が最終的に得た簡単な解決策です: ユーティリティライブラリにフォロー関数を作成します:

public static Configuration LoadConfig()
{
    Assembly currentAssembly = Assembly.GetCallingAssembly();
    return ConfigurationManager.OpenExeConfiguration(currentAssembly.Location);
}

次のように、動的にロードされるライブラリで使用します。

private static readonly Configuration Config = ConfigHelpers.LoadConfig();

そのライブラリがどのようにロードされても、正しい構成ファイルを使用します。

編集: これは、ASP.NET アプリケーションにファイルをロードするためのより良いソリューションかもしれません:

public static Configuration LoadConfig()
{
    Assembly currentAssembly = Assembly.GetCallingAssembly();
    string configPath = new Uri(currentAssembly.CodeBase).LocalPath;
    return ConfigurationManager.OpenExeConfiguration(configPath);
}

ビルド後にファイルをコピーするには、次の行を asp アプリのビルド後のイベントに追加することをお勧めします (ライブラリから構成をプルします)。

copy "$(SolutionDir)<YourLibProjectName>\$(OutDir)$(Configuration)\<YourLibProjectName>.dll.config" "$(ProjectDir)$(OutDir)"
于 2012-08-18T00:19:53.223 に答える
4

私の知る限り、app.config が個別に機能するには、個別のアプリケーション ドメインが必要です。AppDomainSetup を作成すると、使用する構成ファイルを指定できます。これが私がそれを行う方法です:

try
{
  //Create the new application domain
  AppDomainSetup ads = new AppDomainSetup();
  ads.ApplicationBase = Path.GetDirectoryName(config.ExePath) + @"\";
  ads.ConfigurationFile = 
    Path.GetDirectoryName(config.ExePath) + @"\" + config.ExeName + ".config";
  ads.ShadowCopyFiles = "false";
  ads.ApplicationName = config.ExeName;

  AppDomain newDomain = AppDomain.CreateDomain(config.ExeName + " Domain", 
    AppDomain.CurrentDomain.Evidence, ads);

  //Execute the application in the new appdomain
  retValue = newDomain.ExecuteAssembly(config.ExePath, 
    AppDomain.CurrentDomain.Evidence, null);

  //Unload the application domain
  AppDomain.Unload(newDomain);
}
catch (Exception e)
{
  Trace.WriteLine("APPLICATION LOADER: Failed to start application at:  " + 
    config.ExePath);
  HandleTerminalError(e);
}

目的の効果を得るためのもう 1 つの方法は、各 DLL にコンパイルされたリソース ファイル内に構成値を実装することです。構成オブジェクトに対する単純なインターフェイスを使用すると、app.config を参照するのではなく、リソース ファイルを参照するように切り替えることができます。

于 2012-08-16T18:57:19.793 に答える