【问题标题】:Keeping debug strings out of build in C#将调试字符串排除在 C# 中的构建之外
【发布时间】:2012-06-13 13:49:39
【问题描述】:

在编写代码时,我经常在代码中放置调试消息。调试消息由 logger 类处理,该类在调试模式下将消息输出到文件并在发布模式下丢弃它们。

看起来有点像这样:

class Logger : IDisposable
{
    private StreamWriter m_Logger = null;

    public void Start(string logFile)
    {
        m_Logger = new StreamWriter(logFile);
        m_Logger.AutoFlush = true;
    }

    public void Dispose()
    {
        if (m_Logger != null) m_Logger.Dispose();
    }

    public void WriteLine(string message)
    {
        if (m_Logger != null) m_Logger.WriteLine(message);
    }
}

一个实例在启动时创建,可以从Program 类访问。然后我像这样检查调试:

#if DEBUG
Program.Log.Start("app.log");
#endif

这很好用,因为它在调试模式下转储调试信息,而不是在发布模式下。但是,如果我通过诸如strings 之类的实用程序运行发布可执行文件,我仍然可以看到调试字符串。我宁愿将它们完全排除在发布版本之外,以帮助防止逆向工程。

到目前为止,我发现的唯一解决方案是将所有调试消息包装在预处理器条件中:

// < some code here >
#if DEBUG
Program.Log.WriteLine("Some debug message.");
#endif
// < more code here >

这是相当乏味和丑陋的。我的第一个想法是使用某种预处理器宏,但 C# 不支持它们。有没有比我现在使用的更优雅的解决方案?

【问题讨论】:

  • 我不确定这是否是您要查找的内容,但也许您可以使用 a conditional DEBUG attribute 标记记录器中的方法?
  • 你真的需要看看 log4net。
  • @JeremyHolovacs 我以前用过 log4net,但是这个项目太小了,不能保证外部库。

标签: c# logging c-preprocessor


【解决方案1】:

要避免在每个 WriteLine 调用中使用 #if-#endif,请尝试在记录器方法本身上使用 ConditionalAttribute

[Conditional("DEBUG")]
public void WriteLine(string message)
{
    if (m_Logger != null) m_Logger.WriteLine(message);
}

在发布版本的情况下,这将从 MSIL 中排除。

将 ConditionalAttribute 应用于方法向编译器表明 不应将对该方法的调用编译到 Microsoft 中间语言 (MSIL) 除非条件编译符号 定义了与 ConditionalAttribute 关联的。申请 ConditionalAttribute 给一个属性表示该属性 除非条件编译,否则不应将其发送到元数据 符号已定义

【讨论】:

  • 这将导致对 WriteLine 的所有调用都失败,除非它们也被排除在外,不是吗?
  • 为什么会失败?只是不会在发布版本中执行,因为它们会从代码中丢失。
  • 它删除了目标方法并导致编译器基本上忽略所有调用,将它们从IL中完全删除。这完美! :)
  • @Polynomial:很高兴听到这个消息。出于同样的原因,我用过一次 :)
  • @Lieven 是的,就是这样。刚刚用 ildasm 验证 - 没有调用,没有方法代码。确实令人印象深刻!
【解决方案2】:

1) 将 #ifdef 放在 log 方法的主体中,这样您就不必在每条日志消息周围放置定义

2) 如果您试图防止逆向工程,请对代码进行混淆处理,这会加密字符串,但这不是故障安全措施。

3) 在http://www.sharpcrafters.com/solutions/logginghttp://www.sharpcrafters.com/solutions/logging

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2016-08-23
    • 2015-11-24
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多