Как проверить, была ли сборка построена с использованием конфигурации отладки или выпуска?

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

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


person born to hula    schedule 02.02.2010    source источник


Ответы (6)


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

    public bool IsAssemblyDebugBuild(Assembly assembly)
    {
        return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
    }
person David    schedule 02.02.2010
comment
Сарказм особо не нужен. Чаще всего самая сложная часть поиска в Интернете — это знать, что спрашивать. - person doogle; 01.05.2013
comment
Прочтите статью, но ищите лучшие решения в комментариях: var result = Assembly.GetCustomAttributes(false).OfType‹DebuggableAttribute›().Select(da =› da.IsJITTrackingEnabled).FirstOrDefault(); - person stevieg; 30.11.2015

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

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

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

person Rubens Farias    schedule 02.02.2010
comment
+1: на самом деле это цель этой директивы сборки. - person Mike Post; 25.03.2012
comment
Я бы рекомендовал использовать AssemblyConfiguration, а не AssemblyDescription. AssemblyConfiguration задокументирован как Указывает конфигурацию сборки, такую ​​как розничная или отладочная, для сборки. - person R. Schreurs; 11.01.2013
comment
Это работает, но это не так приятно, как возможность обнаруживать вещи в коде, не имея везде #IF. - person ps2goat; 22.10.2013
comment
Насколько я вижу, @R.Schreurs AssemblyConfiguration не отображается ни в свойствах DLL, ни в ildasm (Windows 7). Windows 10 может показать дополнительную информацию, я не знаю. - person NibblyPig; 04.12.2019

Если это ваша сборка, я полагаю, используя атрибут 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 говорит то же самое, но я нашел эту информацию где-то еще, прежде чем увидеть комментарий, поэтому я считаю, что для этого требуется более важная запись, такая как полный ответ, а не комментарий)

person Guillermo Ruffino    schedule 03.11.2014
comment
Я установил этот флаг, но не вижу его в свойствах DLL или с помощью ildasm. - person NibblyPig; 04.12.2019
comment
Не заявлено, что пойдет. Возможно, вам следует следовать рекомендации другого ответа, в котором так говорится. - person Guillermo Ruffino; 06.12.2019

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

person xr280xr    schedule 29.06.2011

Предполагая только конфигурацию отладки и выпуска, символ DEBUG по умолчанию определяется с конфигурацией отладки, поэтому приведенный ниже код в AssemblyInfo.cs (в папке «Свойства»).

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

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

Свойства файла DLL

Для тех, кому нравится ответ Дэвида и Стивига, вот сценарий 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;
        }
    }
}

Проверка выпуска или отладочной сборки с помощью LINQPad5

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

person Chris Voon    schedule 10.03.2016

Не выполняйте развертывание в рабочей среде через Visual Studio. Изучите непрерывную интеграцию и сборку по сценарию (например, с помощью NAnt или что-то более разборчивое, например ФЕЙК).

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

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

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

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

person TrueWill    schedule 02.02.2010
comment
Это никоим образом не отвечает на вопрос. Это хорошая идея, чтобы иметь процесс сборки, это не ответ. - person jasonmw; 21.10.2016