Как определять символы компиляции только при профилировании?

Я хотел бы определить символ компиляции, например PROFILE, только когда я профилирую проект C # в Visual Studio. В обычной отладочной или выпускной сборке он не должен определяться.

Таким образом, код между #if и #endif компилируется только при профилировании.

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

Это должна быть проверка во время компиляции, а не во время выполнения. Причина в том, что у некоторых из нашей команды нет профилировщика на своих ПК (не включенных в VS 2012 Standard), и мы хотели бы, чтобы код компилировался в любой системе без изменений.


person Knasterbax    schedule 20.03.2013    source источник


Ответы (1)


Создайте новую конфигурацию:

  • Нажмите Сборка, затем выберите Диспетчер конфигурации.
  • Нажмите Конфигурация активного решения и выберите Создать.
  • Введите Profile в Имя и выберите, какая конфигурация будет использоваться в качестве шаблона (для профилирования, я думаю, Release).
  • Подтвердите, нажав ОК, будут созданы новые конфигурации с именем Profile для каждого проекта в вашем решении.
  • Откройте свойства каждого проекта и на вкладке «Сборка» добавьте символ PROFILE в Символы условной компиляции, затем сохраните свойства.

Теперь, когда вы создаете конфигурацию Profile, будет определен символ PROFILE. Я предлагаю вам также взглянуть на этот пост, если вы автоматизируете свои сборки, вы можете не допускайте использования символа PROFILE в решении, используя свойства MSBuild через командную строку (я полагаю, вы не очень часто строите для профилирования).

РЕДАКТИРОВАТЬ С помощью конфигурации вы можете это сделать, но это не спасет вас от неработающей ссылки на Microsoft.VisualStudio.Profiler.dll). Я предлагаю переместить весь этот код в другую библиотеку, которую вы отправите им скомпилированной. Там вы выставите только метод:

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

В своем коде вы всегда будете называть его, но он будет выполняться только тогда, когда определен PROFILE (поэтому вам не нужно будет добавлять новую конфигурацию в каждый проект, а только в одну DLL).

person Adriano Repetti    schedule 20.03.2013