Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

    public bool IsAssemblyDebugBuild(Assembly assembly)
    {
        return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
    }

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Просто замените 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 можно загрузить здесь.

Ответ 6

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

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

К хулителям, которые считают, что это не отвечает на вопрос, OP писал:

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

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