VS跨项目配置变量传递问题:如何共享Settings?
跨Visual Studio项目传递配置变量的问题排查与解决方案
首先来说说你遇到的问题:你在ConsoleApp1里定义了test2设置变量,在WpfApp1里定义了test1,但当你从WpfApp1的按钮点击事件里调用ConsoleApp1.Program.Test2 = "var1"并保存后,发现test2被写到了WpfApp1的user.config里,而不是ConsoleApp1自己的配置文件中。
为什么会出现这种情况?
这其实是.NET Settings系统的预期行为,不是bug。当你从WpfApp1的进程中调用ConsoleApp1的代码时,所有的代码执行都是在WpfApp1的应用程序域(AppDomain)里完成的。而.NET的Properties.Settings.Default.Save()方法,是根据当前运行的宿主进程来确定配置文件路径的——简单说就是:谁启动了这个进程,配置就存在谁的user.config里。所以当WpfApp1作为宿主调用ConsoleApp1的设置保存逻辑时,自然会把ConsoleApp1的设置项写到WpfApp1的配置文件中。
排查方向验证
你可以通过以下方式确认这个逻辑:
- 在两个项目中分别打印配置文件的路径,代码如下:
运行后你会发现,当从WpfApp1调用ConsoleApp1的代码时,打印的路径是WpfApp1的// 在ConsoleApp1的Main里或者WpfApp1的按钮事件里添加 Console.WriteLine(Properties.Settings.Default.ConfigurationFilePath);user.config路径,而不是ConsoleApp1的。
正确跨项目共享Settings的几种方法
方法1:使用共享类库统一管理设置
这是最规范的做法,把共享的配置项统一放到一个类库项目中,让两个业务项目都引用这个类库:
- 在解决方案中新建一个类库项目(比如命名为
CommonSettings) - 在这个类库中添加一个Settings文件(右键项目→添加→新建项→设置文件,命名为
SharedSettings.settings) - 在
SharedSettings中添加你需要共享的配置项(比如SharedTest),设置好范围(User或Application) - 在ConsoleApp1和WpfApp1中添加对
CommonSettings类库的引用 - 两个项目中都通过
CommonSettings.Properties.SharedSettings.Default来读写配置:
注意:如果设置项是User范围,每个进程还是会把配置写到自己的// WpfApp1中写入 CommonSettings.Properties.SharedSettings.Default.SharedTest = "var1"; CommonSettings.Properties.SharedSettings.Default.Save(); // ConsoleApp1中读取 var value = CommonSettings.Properties.SharedSettings.Default.SharedTest;user.config里;如果要让两个项目共享同一个配置文件,需要手动指定路径(见方法2)。
方法2:手动指定共享的配置文件路径
如果需要让两个项目读写同一个物理配置文件,可以手动设置Settings的配置文件路径,比如放到公共文档目录:
// 在ConsoleApp1的Test2 setter中修改 public static string Test2 { set { var settings = ConsoleApp1.Properties.Settings.Default; // 指定公共文档目录下的共享配置文件 string sharedConfigPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), "MyApp", "SharedSettings.config" ); // 确保目录存在 Directory.CreateDirectory(Path.GetDirectoryName(sharedConfigPath)); // 设置配置文件路径 settings.ConfigurationFilePath = sharedConfigPath; settings.test2 = value; settings.Save(); } } // 在WpfApp1中读取ConsoleApp1的test2时,也要指定同一个路径 public string GetConsoleTest2() { var settings = ConsoleApp1.Properties.Settings.Default; string sharedConfigPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), "MyApp", "SharedSettings.config" ); settings.ConfigurationFilePath = sharedConfigPath; settings.Reload(); // 重新加载配置 return settings.test2; }
方法3:使用外部配置文件引用(适合Application范围设置)
如果你的配置项是Application范围(不随用户变化),可以用configSource让两个项目引用同一个外部配置文件:
- 在解决方案根目录新建一个
SharedAppSettings.config文件,内容示例:<appSettings> <add key="GlobalSetting" value="SharedValue" /> </appSettings> - 在ConsoleApp1和WpfApp1的
app.config中,修改appSettings节点:
这样两个项目都会读取同一个外部配置文件的内容,适合全局的、不修改的配置项。<appSettings configSource="..\SharedAppSettings.config" />
内容的提问来源于stack exchange,提问作者Dmitri Veselov
相关产品推荐
相关产品推荐

