Как проверить, была ли сборка построена с использованием конфигурации Debug или Release?
Я запускаю развертывание своего веб-приложения, и мне нужно гарантировать, что все сборки, которые будут развернуты, были созданы с использованием конфигурации Release. Наша система была разработана с использованием С#/.NET 3.5.
Есть ли способ достичь этого?
Ответы
Ответ 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. Заблокируйте свои производственные системы, чтобы разработчики прошли официальную процедуру сборки.