Comment vérifier si un ensemble a été construit en utilisant Debug ou configuration Edition?
-
25-09-2019 - |
Question
Je commence le déploiement de mon application web et je dois garantir que toutes les assemblées qui vont être déployées ont été construits en utilisant la configuration de sortie. Notre système a été développé en C # /. Net 3.5.
Y at-il moyen d'y parvenir?
La solution
Vérifier cette . L'idée est que vous obtenez la liste des attributs à l'aide assemblage Assembly.GetCustomAttributes()
et recherche de DebuggableAttribute
puis trouver si un tel attribut a IsJITTrackingEnabled
ensemble de la propriété.
public bool IsAssemblyDebugBuild(Assembly assembly)
{
return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
}
Autres conseils
J'ai adoré que la suggestion de David, mais vous pouvez aussi aller dans cette voie (AssemblyInfo.cs
):
#if DEBUG
[assembly: AssemblyDescription("Your application assembly (DEBUG version)")]
#else if RELEASE
[assembly: AssemblyDescription("Your application assembly (RELEASE version)")]
#endif
Ceci est plus respectueux de l'homme, comme tout le monde peut faire un clic droit cette assemblée, pour sélectionner Properties
et passez à l'onglet Details
.
S'il est de votre assemblée, je crois en utilisant le attribut de AssemblyConfiguration est la meilleure approche. Il est documenté que « Indique la configuration de construction, tels que la vente au détail ou debug, pour un ensemble. »
En fonction de vos configurations de construction que vous pourriez avoir le code comme ceci:
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
Ensuite, vérifiez l'attribut d'assemblage:
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;
}
(Je sais que R. Schreurs commentaire à Rubens Farias dit la même chose, mais je l'ai trouver ces informations ailleurs avant de voir le commentaire que je crois cela nécessite une entrée plus importante comme une réponse complète au lieu d'un commentaire)
Si vous avez réflecteur installé, vous pouvez également cliquer sur l'ensemble et recherchez l'attribut débogable ([assembly: débogable ()]). Dans le volet désassembleur
En supposant que Debug et Release configuration, symbole DEBUG est définie par défaut avec la configuration de débogage, de sorte que le code ci-dessous dans AssemblyInfo.cs (sous le dossier Propriétés).
#if DEBUG
[assembly: AssemblyTitle("Debug")]
#else
[assembly: AssemblyTitle("Release")]
#endif
J'utilise AssemblyTitle sur AssemblyDescription comme il apparaîtra sur mes propriétés de l'explorateur de fichiers Windows 7:
Pour ceux qui aiment la réponse de David et StevieG, voici un script LINQPad écrit en C #. Pour utiliser le script, vous devez télécharger LINQPad 5 et assurez-vous du programme C # est sélectionné comme indiqué la capture d'écran ci-dessous.
Il suffit de remplacer DLL_FOLDER_PATH pour pointer vers le dossier contenant les DLL à inspecter.
// 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;
}
}
}
Ne pas déployer à la production via Visual Studio. Regardez dans d'intégration continue et scénarisé builds (comme avec NAnt , ou peut-être quelque chose de plus lisible comme FAKE ).
La touche F5 est pas un processus de construction
Pour ses détracteurs qui croient que cela ne répond pas à la question, l'OP a écrit:
... Je dois garantir que tous les ensembles qui vont être Déployé ont été construits en utilisant la configuration de sortie.
garantie , utilisez un serveur de build tels que TeamCity et peut-être un outil de gestion des versions comme Octopus Déployer . Verrouillez vos systèmes de production afin que les développeurs doivent passer par le processus de construction officiel.