У меня есть метод, который считывает настройки из моего файла конфигурации следующим образом:
var value = ConfigurationManager.AppSettings[key];
Он отлично компилируется только при ориентации на .NET Standard 2.0.
Теперь мне нужно несколько целей, поэтому я обновил свой файл проекта:
<TargetFrameworks>netcoreapp2.0;net461;netstandard2.0</TargetFrameworks>
Но теперь компиляция не выполняется netcoreapp2.0
со следующим сообщением об ошибке:
Error CS0103 The name 'ConfigurationManager' does not exist in the current context (netcoreapp2.0)
Отдельно я создал новое консольное приложение .NET Core 2.0 (на этот раз предназначенное только для .NET Core 2.0), но похоже, что его нет ConfigurationManager
в пространстве имен System.Configuration
.
Я очень смущен, потому что он доступен в .NET Standard 2.0, поэтому я ожидал, что он будет доступен в .NET Core 2.0, поскольку .NET Core 2.0 совместим с .NET Standard 2.0.
Что мне не хватает?
c#
.net-core
app-config
.net-standard
Алекс Сансо
источник
источник
It compiles fine when targeting .NET Standard 2.0 only
- это не может быть правильным, потому чтоConfigurationManager
не является частью .NET Standard (пока это верно до v.2.1).Ответы:
Да,
ConfigurationManager.AppSettings
доступен в .NET Core 2.0 после ссылки на пакет NuGetSystem.Configuration.ConfigurationManager
.Благодарим @JeroenMostert за то, что он дал мне решение.
источник
<add key="YourSetting" value="YourValue" />
.NET Framework 4.6
как зависимость. Означает ли это, что мой проект .NET Core больше не является чистымCore
проектом?Я установил
System.Configuration.ConfigurationManager
Nuget в свое приложение .net core 2.2.Затем я ссылаюсь
using System.Configuration;
Далее я изменил
Пока я считаю, что это правильно.
4.5.0 is typical with .net core 2.2
У меня не было никаких проблем с этим.
источник
После настройки пакетов вам нужно будет создать app.config или web.config и добавить что-то вроде следующего:
<configuration> <appSettings> <add key="key" value="value"/> </appSettings> </configuration>
источник
Последний набор рекомендаций выглядит следующим образом: (из https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )
Использование:
System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
Из документов:
public static class EnvironmentVariablesExample { [FunctionName("GetEnvironmentVariables")] public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log) { log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage")); log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME")); } public static string GetEnvironmentVariable(string name) { return name + ": " + System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process); } }
источник
using static System.Environment;
Вы можете использовать конфигурацию, чтобы решить эту проблему.
Пример (Startup.cs):
После этой реализации вы можете передавать контроллеры через DI.
public class Startup { public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); Configuration = builder.Build(); } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { var microserviceName = Configuration["microserviceName"]; services.AddSingleton(Configuration); ... }
источник