Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Configuration .net核心应用程序的子进程正在使用父进程';s配置文件_Configuration_.net Core_Console Application - Fatal编程技术网

Configuration .net核心应用程序的子进程正在使用父进程';s配置文件

Configuration .net核心应用程序的子进程正在使用父进程';s配置文件,configuration,.net-core,console-application,Configuration,.net Core,Console Application,我有2.NETCore2.0控制台应用程序。第一个应用程序通过System.Diagnostics.Process.Start()调用第二个应用程序。不知何故,第二个应用程序继承了第一个应用程序的appsettings.development.json中的开发配置信息 我通过在项目根目录中运行dotnet run或在dll所在的文件夹中运行dotnet firstapp.dll来执行第一个应用程序。这是从Powershell中启动的 两个应用程序都是独立的目录。我不确定这是怎么发生的 使用代码更

我有2.NETCore2.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加载配置的方式(这在两个应用程序中是相同的):

类程序
{
专用静态ILogger_记录器;
公共静态IConfigurationRoot\u配置;
公共静态IServiceProvider容器{get;private set;}
静态void Main(字符串[]参数)
{
RegisterServices();
_logger=Container.GetRequiredService();
_logger.LogInformation(“启动GICMON计数计划程序服务”);
Configure();
//此时,DBContext具有来自父级的值!:(
var repo=Container.GetService();
var results=repo.Count(_configuration.GetConnectionString(“DBContext”),args[0]);
}
私有静态void Configure()
{
字符串envvar=“DOTNET\u环境”;
字符串env=Environment.GetEnvironmentVariable(envvar);
if(String.IsNullOrWhiteSpace(env))
抛出新ArgumentNullException(“DOTNET_环境”,“未找到环境变量”);
_logger.LogInformation($“DOTNET_环境变量值为:{env}”);
var builder=new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(“appsettings.json”);
如果(!String.IsNullOrWhiteSpace(env))//environment==“Development”
{
AddJsonFile($“appsettings.{env}.json”,可选:true);
}
_configuration=builder.Build();
}
私有静态无效注册表服务()
{
var services=newservicecolection();
services.AddSingleton();
AddSingleton(typeof(ILogger)、typeof(Logger));
services.AddLogging((builder)=>builder.SetMinimumLevel(LogLevel.Trace));
var serviceProvider=services.BuildServiceProvider();
var loggerFactory=serviceProvider.GetRequiredService();
AddNLog(新的NLogProviderOptions{CaptureMessageTemplates=true,CaptureMessageProperties=true});
loggerFactory.ConfigureNLog(“nlog.config”);
容器=服务提供者;
}
}

问题是由于您将configuration builder的基本路径设置为当前工作目录:

var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json");
创建子进程时,它从父进程继承当前目录(除非显式设置当前目录)

因此子进程基本上使用来自父进程目录的JSON配置

有几种可能的修复方法:

  • 不要将基本路径设置为当前目录

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

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

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

    var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
    
  • 如果出于某种原因希望将configuration builder的基本路径设置为当前目录,则应为启动的子进程设置正确的当前目录:

    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);
    

  • 正如@CodeFuller解释的,原因是两个应用程序读取相同的
    appsettings.{env}.json
    文件。为简单起见,您可以重命名第二个应用程序的配置文件(以及
    .AddJsonFile
    中的相应名称),以防止任何可能的覆盖

    请参阅,当您通过
    .AddJsonFile
    将JSON文件注册为配置源时,配置API允许您使用所需的任何文件名和
    您不必为两个应用程序使用相同的
    $”appsettings.{env}.json“
    模式。

    请使用启动第二个应用程序的代码更新您的答案(精确调用
    System.Diagnostics.Process.Start()
    )。另外,请添加在第二个应用程序中加载配置的代码。@CodeFuller用代码更新了问题。
    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);