是否可以在运行时在不同的 Winform 项目上使用不同的配置文件?
Posted
技术标签:
【中文标题】是否可以在运行时在不同的 Winform 项目上使用不同的配置文件?【英文标题】:Is it possible to use different config file on different Winform Projects at runtime? 【发布时间】:2017-06-18 03:11:22 【问题描述】:基本上我有两个项目。让我们将其命名为项目 A 和项目 B。
这两个项目都是 WinForm 应用程序。
有时我会从项目A调用项目B中的表单。由于两个项目的连接字符串、业务层、服务和模型的实现不同,这些都是在每个项目的app.config下设置的,它们有不同的当然是内容。
换句话说,项目 A 有自己的 app.config。项目 B 有自己的 app.config。
现在我想在我的 winform/winapp 项目的运行时使用或者切换 app.config。这可能吗?
问题是当我启动整个解决方案时(项目 A 设置为启动),项目 A 的 app.config 被加载。现在我想每次调用 Project B 的 winforms 时都使用 Project B 的 app.config。
感谢您提供的任何意见!
【问题讨论】:
可执行文件的配置文件需要所有设置才能运行。每个项目的设置部分都有自己的命名空间,因此您可以将其包含在最终配置文件中。 你可以启动两个项目,让它们通过 WCF (?) 进行通信 但我的项目只是普通的 winform 应用程序。我需要为此创建 wcf 吗? @WillyDavidJr 这是一个 wild 建议 :) 不是答案。也许您需要使用不需要您在运行时动态更改配置的解决方案。也许 Dependenci Injection 能帮到你? 不用担心@JensKloster。这两个项目都是使用独立注入实现的。问题是这两个项目使用了不同的连接字符串、不同的数据访问层、服务和模型,这些已经包含在每个项目中。在项目 A 启动时,它已经使用了在其 app.config 中指定的自己的连接字符串,以及所有相关的基础设施和程序集。现在,如果我调用另一个项目,我无法更改上下文,因为加载的是项目 A 的上下文。 【参考方案1】:之前有人问过您的问题:
使用 Visual Studio 解决方案资源管理器中的“添加现有项”菜单,在第一个项目中添加指向 app.config 的链接。详细信息在此链接中给出:
How to Share App.config?
【讨论】:
这不是问题所在。一点用都没有【参考方案2】:如果您想在运行时更改配置文件,此代码对我来说非常有效,首先创建一个您将调用来更改配置文件的类:
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);
然后在你的程序上调用 this,你可以这样做:
using (AppConfig.Change(@"D:\app.config"))
//TODO:
【讨论】:
以上是关于是否可以在运行时在不同的 Winform 项目上使用不同的配置文件?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在不使用类变量的情况下在运行时在实例上创建 pyqtSignals?
是否可以阻止用户在 HTML 运行时在文本框中输入长度超过 5 的值? [关闭]