是否可以在运行时在不同的 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?

在C#winform中同一窗体显示不同内容?

是否可以阻止用户在 HTML 运行时在文本框中输入长度超过 5 的值? [关闭]

vs2010在win10中打包winform程序,无法在win7上运行,win10正常运行。

c#winform如何画像vs一样的界面

在运行时在 kotlin 中的相机上运行的不同 ML 模型之间切换