Como verificar se uma montagem foi criada usando a configuração de depuração ou liberação?
-
25-09-2019 - |
Pergunta
Estou iniciando a implantação do meu aplicativo da web e preciso garantir que todos os conjuntos que serão implantados foram criados usando a configuração de liberação. Nosso sistema foi desenvolvido usando C#/. NET 3.5.
Existe alguma maneira de conseguir isso?
Solução
Verificar isto. A idéia é que você obtenha a lista de atributos de montagem usando Assembly.GetCustomAttributes()
e procurar DebuggableAttribute
e então encontre se esse atributo tem IsJITTrackingEnabled
conjunto de propriedades.
public bool IsAssemblyDebugBuild(Assembly assembly)
{
return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
}
Outras dicas
Eu amei isso David sugestão, mas você também pode seguir por esse caminho (AssemblyInfo.cs
):
#if DEBUG
[assembly: AssemblyDescription("Your application assembly (DEBUG version)")]
#else if RELEASE
[assembly: AssemblyDescription("Your application assembly (RELEASE version)")]
#endif
Isso é mais amigável ao humano, como qualquer um pode clicar com o botão direito do mouse, para selecionar Properties
e vai para Details
aba.
Se for a sua montagem, acredito usar o AssemblyConfiguration atributo é a melhor abordagem. Ele está documentado como "especifica a configuração de construção, como varejo ou depuração, para uma assembléia".
Dependendo das suas configurações de construção, você pode ter código assim:
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
Em seguida, verifique o atributo de montagem:
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;
}
(Eu sei que R. Schreurs Comentário no Rubens Farias diz o mesmo, mas encontrei essas informações em outro lugar antes de ver o comentário, então acredito que isso requer uma entrada mais importante como uma resposta completa em vez de um comentário)
Se você tiver o refletor instalado, também poderá clicar na montagem e procurar o atributo degível ([Assembléia: depurável ()]) no painel Desmokebler.
Assumindo apenas a configuração de depuração e liberação, o símbolo de depuração é, por padrão, definido com a configuração de depuração; portanto, o código abaixo no AssemblyInfo.cs (na pasta Properties).
#if DEBUG
[assembly: AssemblyTitle("Debug")]
#else
[assembly: AssemblyTitle("Release")]
#endif
Eu uso o AssemblyTitle Over AssemblyDescription, pois ele aparecerá nas minhas propriedades do Windows 7 File Explorer:
Para aqueles que gostam da resposta de David e Stevieg, aqui está um script Linqpad escrito em C#. Para usar o script, você precisa baixar Linqpad 5 e verifique se o programa C# está selecionado conforme mostrado na captura de tela abaixo.
Basta substituir DLL_Folder_Path para apontar para a pasta que contém as DLLs a serem inspecionadas.
// 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;
}
}
}
Linqpad 5 pode ser baixado aqui.
Não implante na produção via Visual Studio. Investigar Integração contínua e construções com script (como com Nant, ou talvez algo mais legível como FALSO).
A chave F5 não é um processo de construção
Para detratores que acreditam que isso não responde à pergunta, o OP escreveu:
... Preciso garantir que todos os conjuntos que serão implantados foram criados usando a configuração de liberação.
Para garantia isso, use um servidor de construção, como Teamcity e possivelmente uma ferramenta de gerenciamento de liberação como Octopus implantar. Bloqueie seus sistemas de produção para que os desenvolvedores façam o processo oficial de construção.