当你想在调试/开发和发布/生产中有不同的行为时,似乎Preprocessor Directives(IHostingEnvironment.EnvironmentName
)和ASP.NET Core Environment Name(public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
#if DEBUG
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
#else
app.UseExceptionHandler("/Error");
#endif
}
)都可以使用。何时适合使用一个而不是另一个
#if DEBUG
的示例public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Error");
}
}
env.IsDevelopment()
的示例require
更新: 这个问题我在寻找什么时候应该使用ASP.NET核心环境名称(.NET核心的一个新功能)。这与#if和条件属性
的其他问题不同答案 0 :(得分:7)
预处理程序指令是有条件编译的......
这意味着这样的事情:
#if DEBUG
//Do something
#endif
仅在定义DEBUG
符号时才编译和检查(在构建设置为DEBUG时定义)。此外,在IDE中,预处理程序符号之间的代码将显示为灰色。
此代码:
if (env.IsDevelopment())
{
//Do something
}
针对发布/调试环境进行编译。这里的关键是代码存在,并且无论环境是调试/发布,测试都会运行。在更复杂的情况下,这有两个影响:
另外,在发布环境中包含调试代码可能会在发布时泄露一些商业机密或其他重要信息。尽可能避免在发布模式下发布调试代码。
答案 1 :(得分:2)
虽然DEBUG预编译器指令的其他答案是正确的,但我认为他们忽略了问题的关键点,即何时使用一种方法而不是另一种方法。
我有一个非常具体的例子,我必须使用IsDevelopment而不是#if DEBUG ...
如前所述,#if DEBUG仅包含编译中用于调试版本配置的代码,并且灰显并且不包括发布配置的代码。
IsDevelopment方法根本不依赖于构建配置,它依赖于.NET Core环境变量,特别是" environmentVariables"在Properties文件夹中的launchSettings.json中设置
所以你可以利用这个优势...在我的情况下,我有一个web应用程序,我只想在调试时写入日志文件,并且在运行时写入本地目录是一个例外Web服务器,所以我不能使用#if DEBUG指令。
但是,如果我依赖将IHostingEnvironment注入我的类的构造函数并将其设置为本地字段,我可以测试_environment.IsDevelopment()调用,并且当我从Visual Studio IDE运行时只执行此代码< / p>
我相信这些设置默认位于launchSettings.json中:
&#34;个人资料&#34;:{ &#34; IIS Express&#34;:{ &#34; commandName&#34;:&#34; IISExpress&#34;, &#34; launchBrowser&#34;:是的, &#34; environmentVariables&#34;:{ &#34; ASPNETCORE_ENVIRONMENT&#34;:&#34;发展&#34; } },
换句话说,当你想要进一步区分而不仅仅是在&#34;调试&#34;配置或环境,并希望在从IDE运行时专门运行,使用IsDevelopment。
答案 2 :(得分:1)
如果您想对其执行不同的操作,请执行以下操作:开发,登台和生产环境(可能是服务器容量或配置的结果),可以通过使用IHostingEnvironment.EnvironmentName应用检查来完成。
&#39; #if DEBUG&#39;方法不允许你这样做,因为在编译时决定包含在语句中的代码。
答案 3 :(得分:0)
您可以更改配置环境,仅使用IHostingEnvironment
构建应用程序一次。这是正确构建和测试应用程序的理想方法。
预处理器指令将在编译时更改IL,这可能会引入一些额外的风险/ hiesenbug。
答案 4 :(得分:0)
使用#if DEBUG
,非执行分支中的代码甚至不会被编译并包含在程序集中,而env.IsDevelopment()
将会是。#if DEBUG
。因此,您可以使用#if WINCE
或#if !DEBUG
或#if DOTNET45
或Conditional("DEBUG")
或您选择定义的任何其他自定义来编译和构建特定平台,否则可能会为您编译错误。
此外,您可以使用{{1}}属性修饰方法,并且任何调用该方法的代码都不会编译到程序集中。