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