gpt4 book ai didi

configuration - .net 核心应用程序的子进程正在使用父进程的配置文件

转载 作者:行者123 更新时间:2023-12-05 05:17:14 24 4
gpt4 key购买 nike

我有 2 个 .NET Core 2.0 控制台应用程序。第一个应用程序通过 System.Diagnostics.Process.Start() 调用第二个应用程序。第二个应用程序以某种方式继承了第一个应用程序的 appsettings.development.json 中的开发配置信息。

我通过在项目的根目录中运行 dotnet run 或在 DLL 所在的文件夹中运行 dotnet firstapp.dll 来执行第一个应用程序。这是从 Powershell 开始的。

两个应用程序都是单独的目录。我不确定这是怎么发生的。

更新代码

应用程序位于

C:\Projects\ParentConsoleApp
C:\Projects\ChildConsoleApp

这是我从父应用程序调用应用程序的方式:

System.Diagnostics.Process.Start("dotnet", "C:\\projects\\ChildConsoleApp\\bin\\Debug\\netcoreapp2.0\\publish\\ChildConsoleApp.dll" + $" -dt {DateTime.Now.Date.ToString("yyyy-MM-dd")}");

这是我从 JSON 加载配置的方式(这在两个应用程序中都是相同的):

class Program
{
private static ILogger<Program> _logger;

public static IConfigurationRoot _configuration;

public static IServiceProvider Container { get; private set; }

static void Main(string[] args)
{
RegisterServices();

_logger = Container.GetRequiredService<ILogger<Program>>();
_logger.LogInformation("Starting GICMON Count Scheduler Service");

Configure();

// At this point DBContext has value from parent! :(
var repo = Container.GetService<ICountRepository>();
var results = repo.Count(_configuration.GetConnectionString("DBContext"), args[0]);


}
private static void Configure()
{
string envvar = "DOTNET_ENVIRONMENT";
string env = Environment.GetEnvironmentVariable(envvar);
if (String.IsNullOrWhiteSpace(env))
throw new ArgumentNullException("DOTNET_ENVIRONMENT", "Environment variable not found.");
_logger.LogInformation($"DOTNET_ENVIRONMENT environment variable value is: {env}.");
var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
if (!String.IsNullOrWhiteSpace(env)) // environment == "Development"
{
builder.AddJsonFile($"appsettings.{env}.json", optional: true);
}
_configuration = builder.Build();
}

private static void RegisterServices()
{
var services = new ServiceCollection();
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
services.AddLogging((builder) => builder.SetMinimumLevel(LogLevel.Trace));
var serviceProvider = services.BuildServiceProvider();
var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
loggerFactory.AddNLog(new NLogProviderOptions { CaptureMessageTemplates = true, CaptureMessageProperties = true });
loggerFactory.ConfigureNLog("nlog.config");
Container = serviceProvider;
}
}

最佳答案

问题是由于您将配置构建器的基本路径设置为当前工作目录引起的:

var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");

当您创建子进程时,它会从父进程继承当前目录(除非您明确设置当前目录)。

所以子进程基本上使用父进程目录中的 JSON 配置。

有几种可能的修复方法:

  1. 不要将基本路径设置为当前目录。

    启动应用程序时,您不确定当前目录是否与放置应用程序二进制文件的目录相匹配。如果您在 c:\test\SomeApp.exe 中有一个 exe 文件并在当前目录为 c:\ 时从命令行启动它,那么您的当前目录应用程序将是 c:\。在这种情况下,如果将配置生成器的基本路径设置为当前目录,它将无法加载配置文件。

    默认情况下,配置生成器从 AppContext.BaseDirectory 加载配置文件,这是放置应用程序二进制文件的目录。在大多数情况下,这应该是理想的行为。

    所以只需删除 SetBasePath() 调用:

    var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
  2. 如果出于某种原因你想将配置生成器的基本路径设置为当前目录,那么你应该为启动的子进程设置正确的当前目录:

    var childDllPath = "C:\\projects\\ChildConsoleApp\\bin\\Debug\\netcoreapp2.0\\publish\\ChildConsoleApp.dll";
    var startInfo = new ProcessStartInfo("dotnet", childDllPath + $" -dt {DateTime.Now.Date.ToString("yyyy-MM-dd")}")
    {
    WorkingDirectory = Path.GetDirectoryName(childDllPath),
    };

    Process.Start(startInfo);

关于configuration - .net 核心应用程序的子进程正在使用父进程的配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49545611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com