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);
}

获得所需效果的另一种方法是在编译到每个 DLL 中的资源文件中实现配置值。配置对象上的简单接口将允许您切换查看 app.config 与查看资源文件。

于 2012-08-16T18:57:19.793 回答
1

如果您稍微更改代码,它可能会起作用:

public string Name
{
    get { 
        Configuration conf = ConfigurationManager.OpenExeConfiguration("library.dll");
        return conf.AppSettings.Settings["House"].Value; 
    }
}
于 2015-09-09T20:53:58.410 回答