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

StackOverflow https://stackoverflow.com/questions/2186613

Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

Я любил это Дэйвид предложение, но вы также можете пойти так (AssemblyInfo.cs):

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

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

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

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

#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;
}

(Я знаю комментарий R. Schreurs на Рубенс Фариас говорит о том же, но я нахожу эту информацию где-то еще, прежде чем видеть комментарий, поэтому я считаю, что это требует более важной записи, как полный ответ вместо комментариев)

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

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

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

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

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 можно скачать здесь.

Не развертывайте до производства через Visual Studio. Заглянуть Непрерывная интеграция и сценарию сборки (например, с Наматывать, или, возможно, что-то более разборчиво ПОДДЕЛКА).

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

Чтобы утроить, которые считают, что это не отвечает на вопрос, ОП написал:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top