.NET Core 2.0配置对接.NET Framework的ConfigurationManager方案咨询
完全可以做到!你之前只安装System.Configuration.ConfigurationManager NuGet包没生效,是因为只解决了Project B能调用这个类的问题,但没把.NET Core的配置同步到ConfigurationManager.AppSettings这个静态集合里——而Project A正是从这个集合读取配置的。
下面是具体步骤:
第一步:确保Project B安装正确的NuGet包
在Project B的NuGet包管理器中安装System.Configuration.ConfigurationManager,选择适配.NET Core 2.0的版本(比如4.7.0,这个版本对.NET Core 2.0支持很好)。第二步:在Project B启动时同步配置
打开Project B的Program.cs(或者Startup类的初始化逻辑),在应用启动的最开始,把.NET Core配置系统加载的内容注入到ConfigurationManager.AppSettings中:using System.Configuration; using Microsoft.Extensions.Configuration; using System.IO; namespace ProjectB { class Program { static void Main(string[] args) { // 加载.NET Core配置(这里以appsettings.json为例) var configBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); var config = configBuilder.Build(); // 将配置同步到ConfigurationManager.AppSettings foreach (var kvp in config.AsEnumerable()) { if (!string.IsNullOrWhiteSpace(kvp.Value)) { // 存在则覆盖,不存在则添加 ConfigurationManager.AppSettings[kvp.Key] = kvp.Value; } } // 现在再调用Project A的代码,它就能读到配置了 ProjectA.SomeClass.DoSomething(); } } }第三步:确保appsettings.json能被读取到
右键Project B中的appsettings.json文件,设置“复制到输出目录”为如果较新则复制(或者始终复制),这样运行时程序才能找到这个配置文件。
原理说明
Project A运行时是在Project B的进程空间内,它调用ConfigurationManager.AppSettings["key"]读取的是当前进程的静态配置集合。我们通过在Project B启动时把.NET Core配置系统加载的键值对注入到这个集合里,就能让Project A无需修改任何代码,直接读取到这些配置。
另外,如果你更习惯用传统的app.config文件,也可以在Project B中添加一个app.config,在<appSettings>节点下写配置,ConfigurationManager会自动读取这个文件(编译后会生成ProjectB.exe.config),这种方式更接近.NET Framework的配置习惯,同样不需要修改Project A的代码。
内容的提问来源于stack exchange,提问作者JanivZ

