【问题标题】:How to define compilation symbols only when profiling?如何仅在分析时定义编译符号?
【发布时间】:2013-03-09 11:07:20
【问题描述】:

仅当我在 Visual Studio 中分析 C# 项目时,我想定义像 PROFILE 这样的编译符号。在正常的调试或发布版本中不应定义它。

所以#if 和#endif 之间的代码只有在分析时才会被编译。

#if PROFILE
  DataCollection.StartProfile(ProfileLevel.Process, DataCollection.CurrentId); 
#endif

应该是编译时检查,没有运行时检查。原因是我们的一些团队在他们的 PC 上没有分析器(不包括在 VS 2012 标准中),我们希望代码能够在任何系统上编译而无需更改。

【问题讨论】:

    标签: c# profiling c-preprocessor symbols conditional-compilation


    【解决方案1】:

    创建一个新的配置

    • 点击Build,然后选择Configuration Manager
    • 点击活动解决方案配置并选择新建
    • 名称中输入Profile,然后选择要用作模板的配置(我猜是Release进行分析)。
    • 点击OK确认,它将为您解决方案中的每个项目创建名为Profile的新配置。
    • 打开每个项目的属性,在Build选项卡的条件编译符号中添加PROFILE符号,然后保存属性。

    现在,当您构建 Profile 配置时,将定义 PROFILE 符号。我建议你也看看this post,如果你自动化你的构建,你可以通过命令行使用MSBuild属性将你的PROFILE符号排除在解决方案之外(我想你不经常为分析而构建) .

    编辑 使用 configuration 您可以做到这一点,但它不会使您免于对Microsoft.VisualStudio.Profiler.dll 的损坏引用)。我的建议是将所有这些代码移动到另一个库,您将编译后将其发送给他们。在那里你将只公开一个方法:

    public static class ProfilingHelpers
    {
        [Conditional("PROFILE")]
        public static void StartProfiling()
        {
            DataCollection.StartProfile(ProfileLevel.Process, DataCollection.CurrentId);
        }
    }
    

    在您的代码中,您将始终调用它,但仅在定义 PROFILE 时才会执行(因此您无需为每个项目添加新配置,而只需添加到一个 DLL)。

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 2013-03-07
      • 2015-05-23
      • 2016-11-18
      • 2023-03-19
      • 1970-01-01
      • 2011-12-18
      相关资源
      最近更新 更多