Как проверить, была ли сборка построена с использованием конфигурации Debug или Release? - PullRequest
41 голосов
/ 02 февраля 2010

Я начинаю развертывание моего веб-приложения, и я должен гарантировать, что все сборки, которые будут развернуты, были созданы с использованием конфигурации выпуска.Наша система была разработана с использованием C # /. Net 3.5.

Есть ли способ добиться этого?

Ответы [ 6 ]

39 голосов
/ 02 февраля 2010

Проверьте это . Идея состоит в том, что вы получаете список атрибутов сборки, используя Assembly.GetCustomAttributes(), ищите DebuggableAttribute, а затем находите, имеет ли такой атрибут IsJITTrackingEnabled установленное свойство.

    public bool IsAssemblyDebugBuild(Assembly assembly)
    {
        return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
    }
27 голосов
/ 02 февраля 2010

Мне понравилось это предложение Дэвида , но вы также можете пойти по этому пути (AssemblyInfo.cs):

#if DEBUG
[assembly: AssemblyDescription("Your application assembly (DEBUG version)")]
#else if RELEASE
[assembly: AssemblyDescription("Your application assembly (RELEASE version)")]
#endif

Это более удобно для человека, так как любой может щелкнуть правой кнопкой мыши по этой сборке, выбрать Properties и перейти на вкладку Details.

7 голосов
/ 03 ноября 2014

Если это ваша сборка, я считаю, что использование AssemblyConfiguration является лучшим подходом.Он задокументирован как «Определяет конфигурацию сборки, такую ​​как розничная или отладочная, для сборки.»

В зависимости от ваших конфигураций сборки у вас может быть такой код:

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

Затем проверьтеатрибут сборки:

public static bool IsAssemblyConfiguration(Assembly assembly, string configuration)
{
    var attributes = assembly.GetCustomAttributes(typeof(AssemblyConfigurationAttribute), false);
    if (attributes.Length == 1)
    {
        var assemblyConfiguration = attributes[0] as AssemblyConfigurationAttribute;
        if (assemblyConfiguration != null)
        {
            return assemblyConfiguration.Configuration.Equals(configuration, StringComparison.InvariantCultureIgnoreCase);
        }
    }
    return true;
}

(я знаю, что комментарий Р. Шрерса в Rubens Farias говорит то же самое, но я нашел эту информацию где-то еще до того, как увидел комментарий, поэтому я считаю, что для этого требуется более важная запись, такая какполный ответ вместо комментария)

2 голосов
/ 10 марта 2016

При условии только конфигурации Debug и Release символ DEBUG по умолчанию определен в конфигурации Debug, поэтому код ниже в AssemblyInfo.cs (в папке Properties).

#if DEBUG
[assembly: AssemblyTitle("Debug")]
#else
[assembly: AssemblyTitle("Release")]
#endif

Я использую AssemblyTitle поверх AssemblyDescription, как это будет показано в свойствах моего проводника Windows 7:

DLL File properties

Для тех, кому нравится ответ Дэвида и Стевига, вот скрипт LINQPad, написанный на C #. Чтобы использовать скрипт, вам нужно скачать LINQPad 5 и убедиться, что выбрана программа C #, как показано на скриншоте ниже.

Просто замените DLL_FOLDER_PATH, чтобы он указывал на папку, содержащую библиотеки DLL для проверки.

// TODO - Specify your folder containing DLLs to inspect
static string DLL_FOLDER_PATH = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0";
void Main()
{
    (from dllPath in Directory.GetFiles(DLL_FOLDER_PATH, "*.dll")
    let assembly = dllPath.SafeLoad()
    let build = assembly == null ? "Error" : (dllPath.SafeLoad().IsAssemblyDebugBuild() ? "Debug" : "Release")
    select new {
        Assembly_Path = dllPath,
        Build = build,
    }).Dump();
}
static class Extensions {
    public static bool IsAssemblyDebugBuild(this Assembly assembly)
    {
        return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Select(da => da.IsJITTrackingEnabled).FirstOrDefault();
    }
    public static Assembly SafeLoad(this string path){
        try{
            return Assembly.LoadFrom(path);
        }
        catch {
            return null;
        }
    }
}

Checking release or debug build using LINQPad5

LINQPAD 5 можно загрузить здесь .

2 голосов
/ 29 июня 2011

Если у вас установлен Reflector, вы также можете нажать на сборку и найти атрибут debuggable ([assembly: Debuggable ()]) на панели дизассемблера.

0 голосов
/ 02 февраля 2010

Не развертывать в производство через Visual Studio.Посмотрите на Непрерывная интеграция и сборочные сценарии (такие как NAnt или, возможно, что-то более разборчивое, например FAKE ).

Клавиша F5 не является процессом сборки

Для недоброжелателей, которые считают, что это не отвечает на этот вопрос, ОП написал:

... Мне нужно гарантировать, что всесборки, которые будут развернуты, были собраны с использованием конфигурации выпуска.

К гарантируют , что используйте сервер сборки, такой как TeamCity и, возможно, выпускинструмент управления, такой как Octopus Deploy .Заблокируйте свои производственные системы, чтобы разработчики прошли официальный процесс сборки.

...