如何在发布模式下使用 C# #if 调试(preprocesser 指令),而无需更改生产环境中的文件?

How to use C# #if debug (preprocesser directive) in release mode without changing files in production environment?

提问人:Pravin 提问时间:2/23/2023 最后编辑:wohlstadPravin 更新时间:2/23/2023 访问量:82

问:

我想知道是否可以在我的开发方案中使用该 #if。我想捕获生产环境中每个方法的执行时间。

为此,我正在考虑使用秒表类并根据配置文件中设置的条件将经过的时间写入日志中。在配置文件中,我们有一个名为 Loglevel 的选项,它包含诸如“Error,debug,info,All”之类的值。在生产环境中,我们将日志级别类型设置为“Error”以仅捕获错误。因此,我将要写入的日志不会写入文件中。当客户报告问题时,我们会将错误日志设置更改为调试,以便所有信息都将写入日志中。

但是,我不想采用这种方法,因为即使我将 LogLevel 值设置为仅捕获 Error,也会执行不必要的行代码。因此,计划使用 #if 调试来捕获执行时间。我不确定这是否适用于生产环境,而无需替换在发布模式下构建的 dll 或项目文件。#if 调试会在发布模式下工作吗?如果是这样,我如何执行代码行以捕获执行时间,而无需替换文件,而只需更改配置?TIA。

下面是示例代码

public int process()
{
#if Debug
    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
#endif
    Int a = 20;
    Int b = 30;
    Int c = a+ b;
#if Debug
    stopwatch.Stop();
    this.WritePerformanceLog(0, System.Reflection.MethodInfo.GetCurrentMethod().ReflectedType.ToString()+" "+System.Reflection.MethodInfo.GetCurrentMethod().Name, "API", DateTime.UtcNow, DateTime.UtcNow,stopwatch.Elapsed.ToString());
    stopwatch = null;
#endif
    return C
}
C# ASP.NET-MVC-4 预处理器指令

评论

3赞 Anand Sowmithiran 2/23/2023
#if DEBUG 行之间存在的代码不会在模式下构建,并且您只会将发布模式二进制文件发送到生产环境,因此这不起作用。对于所花费的录制时间,您可以为应用发出。然后,如果报告了任何问题,您可以请求运行,性能计数器的转储将有助于您的分析。Releaseperformance counterPerfMon
1赞 wohlstad 2/23/2023
旁注:调试构建的预处理器宏通常是 ,而不是 。DEBUGDebug

答:

0赞 JonasH 2/23/2023 #1

我想捕获生产环境中每个方法的执行时间。

使用探查器。

虽然秒表的开销相当低。写入每个方法调用的日志只会破坏性能。在代码中撒上 #if 指令以启用秒表会使您的代码变得一团糟,甚至可能无法很好地衡量性能。

探查器正是为此目的而设计的,应该在完全不更改程序集的情况下工作,并且应该具有相当低的开销,具体取决于您使用的模式。Visual Studio 内置了探查器,但也有第三方探查器。

秒表可能有助于检查已知速度较慢的特定方法的运行时,以及您可能想要日志的位置,因此添加秒表基本上是免费的,如果数据库调用或类似操作花费的时间比预期的要长得多,则可能是有用的诊断工具。