.net 如何检查应用程序是否处于调试或发布状态

eqfvzcg8  于 2022-11-19  发布在  .NET
关注(0)|答案(6)|浏览(303)

我正忙碌着对我的一个应用程序进行一些优化,什么是最干净的方法来检查应用程序是否处于调试或发布状态

ryoqjall

ryoqjall1#

在编译时还是在运行时-在编译时,可以使用#if DEBUG。在运行时,可以使用[Conditional("DEBUG")]来指示只应在调试版本中调用的方法,但这是否有用取决于要在调试版本和发布版本之间进行的更改类型。

6psbrbz9

6psbrbz92#

static class Program
{
    public static bool IsDebugRelease
    {
        get
        {
 #if DEBUG
            return true;
 #else
            return false;
 #endif
        }
     }
 }

不过,我倾向于同意伊托尔森的观点。

bnl4lu3b

bnl4lu3b3#

我个人不喜欢#if DEBUG改变布局的方式,我通过创建一个条件方法来实现,这个方法只在调试模式下调用,并通过引用传递一个布尔值。

[Conditional("DEBUG")]
private void IsDebugCheck(ref bool isDebug)
{
    isDebug = true;
}
 
public void SomeCallingMethod()
{ 
    bool isDebug = false;
    IsDebugCheck(ref isDebug);

    //do whatever with isDebug now
}
amrnrhlw

amrnrhlw4#

我倾向于在AssemblyInfo.cs中放置如下内容:

#if DEBUG
[assembly: AssemblyConfiguration("Debug build")]
#else
[assembly: AssemblyConfiguration("Release build")]
#endif
fjaof16o

fjaof16o5#

您可以将ILSpy用于exe和dll。只需将DLL\EXE拖到资源管理器侧栏,您就可以看到:[程序集:可调试行....
范例1:编译为出版模式:

示例2:编译为调试模式:

brc7rcf0

brc7rcf06#

即使线程是旧的,它可能是有用的,有一个程序检查。

if (Debugger.IsAttached)
{
}

在运行时检查是否附加了调试器。IsAttached属性是调试器类型的静态属性,因此它始终提供bool结果。
预处理器指令#if DEBUG是目前在编译时删除(或将其抛出)某些代码的最快方法,但在发布和调试编译之间切换时可能会发出警告,尤其是当您在块中定义变量时(至少在注解中)。例如,检查以下DebugInfo()方法的实现,该方法允许您轻松地内联到日志记录工具中:

/// <summary>
        ///     A wrapper for debugging information in the Serilog loggers.
        ///     Usage:  Log.DebugInfo().Information(message)
        ///     Usage:  Log.DebugInfo().Debug(message) etc.
        /// </summary>
        /// <param name="logger">
        ///     The Serilog Log to use.
        /// </param>
        /// <param name="memberName">
        ///     The name of the class calling the event log.
        /// </param>
        /// <param name="sourceFilePath">
        ///     The name of the file hosting the class.
        /// </param>
        /// <param name="sourceLineNumber">
        ///     the line in the source code file.
        /// </param>
        /// <returns>
        /// </returns>
 public static ILogger DebugInfo(this ILogger logger
#if DEBUG
            // DebugInfo gets inline in release mode.
            ,
            [CallerMemberName] string memberName = "",
            [CallerFilePath] string sourceFilePath = "",
            [CallerLineNumber] int sourceLineNumber = 0)
#else
)
#endif
        {
            return logger
#if DEBUG
                .ForContext("MemberName", memberName)
                .ForContext("FilePath", Path.GetFileName(sourceFilePath))
                .ForContext("LineNumber", sourceLineNumber)
#endif
;
        }
    }

可以这样称呼

Logger.DebugInfo().Warning("Warining message with a parameter in message template style: {Parameter}", _parameter);

以在日志文件中获得有关调用日志行的类和代码文件的更多信息。
解决方案是将XML注解的一部分也包含到条件语句中,但这会使整个注解不可读。
在Hans的注解之后,是的,有人可能在VS之外运行调试版本,这是一种病态的可能性。那么,Matthew IsDebugMode提出的静态方法是最直接的方法,它将条件语句的优点包括在一个简单的方法中,而不允许其缺点在代码中蔓延。

相关问题