在.NET Core 2中引用依赖于ConfigurationManager的.NET Framework程序集

8
我们有一些遗留的4.5.2类库,常用ConfigurationManager.AppSettings[key]。 是否可以在 .net core 2 应用程序中引用它们,以便在幕后正确地修补配置?也就是说,旧的调用到ConfigurationManager.AppSettings[key]在 .netcore2 应用程序中正确读取配置,无论是来自于json还是xml。
如果我将问题的keys移植到appSettings.json中,那么对ConfigurationManager.AppSettings的调用总是返回null。
例如:
{
"Logging": {
    "IncludeScopes": false,
    "Debug": {
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "Console": {
        "LogLevel": {
            "Default": "Warning"
        }
    }
},
"appSettings": {"test": "bo"},
"test": "hi"
}

然后:

[HttpGet]
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2", ConfigurationManager.AppSettings["test"] , ConfigurationManager.AppSettings["appSettings:test"] };
}

会显示:

["value1","value2",null,null]

我承认这不是在.netcore2中处理配置的正确方式,但是我想试图评估遗留代码库可以在不进行修改的情况下工作的程度。 - boro2g
你解决了吗? - Olaj
不,我们还没有将这些项目迁移到 .NET Core。 - boro2g
这可能会有所帮助 https://stackoverflow.com/questions/50258251/net-core-2-0-appsettings-with-net-full-framework-using-configurationmanager - ATerry
@ATerry 这难道不需要将.NET 4.5.2项目升级到.NET 4.6.1吗,因为4.5.x与.NET Core/Standard 2不兼容? - pfx
1个回答

6

您需要的设置是可能的,而且在app.config中可以保持不变。

我有一个.NET 4.5.2类库"MyLibrary"和一个.NET Core 2.0 Web应用程序"WebApp",引用了完整的.NET Framework 4.6.1。

MyLibrary

  • 具有对System.Configuration的程序集引用
  • 有一个名为Foo的类,该类读取一个名为foo的appsetting

WebApp

  • 引用了MyLibrary项目
  • 具有对System.Configuration的程序集引用
  • 具有包含appSettings部分的app.config文件。(.NET Core 2.0 Web应用程序项目默认情况下存在App.config。)
  • 使用Foo的实例,调用其GetSomething方法,将值bar分配给变量something

所有其他文件和设置都是默认值。以下是上述提到的文件。


MyLibrary项目

.NET 4.5.2

Foo.cs

using System;
using System.Configuration;

namespace PFX
{
    public class Foo
    {
        public String GetSomething()
        {
            String r = ConfigurationManager.AppSettings["foo"];
            return r;
        }
    }
}

WebApp项目

.NET Core 2.0.1 引用完整的 .NET Framework 4.6.1。

WebApp.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">    
    <PropertyGroup>
        <TargetFramework>net461</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore" Version="2.0.3" />
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.4" />
        <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.4" PrivateAssets="All" />
        <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.3" />
        <PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="2.0.3" />
    </ItemGroup>

    <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.4" />
     </ItemGroup>

     <ItemGroup>
        <ProjectReference Include="..\MyLibrary\MyLibrary.csproj" />
     </ItemGroup>

    <ItemGroup>
        <Reference Include="System.Configuration" />
    </ItemGroup>    
</Project>

App.config

<configuration>
    <runtime>
       <gcServer enabled="true"/>
    </runtime>

    <appSettings>
        <add key="foo" value="bar"/>
    </appSettings>
</configuration>

Program.cs

using System;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace WebApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            PFX.Foo foo = new PFX.Foo();
            String someting = foo.GetSomething(); // bar

            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(String[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接