如何检查程序集是否是使用调试或发布配置构建的?
-
25-09-2019 - |
题
我正在开始部署我的 Web 应用程序,我需要保证所有要部署的程序集都是使用发布配置构建的。我们的系统是使用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
标签。
如果这是你的组件,我相信使用 装配配置 属性是最好的方法。它被记录为“指定程序集的构建配置,例如零售或调试”。
根据您的构建配置,您可能拥有如下代码:
#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。鲁本斯·法里亚斯 (Rubens Farias) 的施鲁尔斯 (Schreurs) 评论也说了同样的话,但我在看到评论之前在其他地方找到了此信息,所以我相信这需要更重要的条目,例如完整回复而不是评论)
如果你有反射器安装也可以单击装配并查找可调试属性([组件:可调试()])。在拆装窗格
假设只有调试和发布的配置,调试符号是通过与调试配置定义的缺省,所以在AssemblyInfo.cs中下面的代码(属性文件夹下)。
#if DEBUG
[assembly: AssemblyTitle("Debug")]
#else
[assembly: AssemblyTitle("Release")]
#endif
我使用过AssemblyTitle作为AssemblyDescription它会出现在我的Windows 7的文件浏览器属性:
对于那些谁像大卫和stevieg的答案,这里是用C#编写一个脚本LINQPad。要使用该脚本,您需要下载 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;
}
}
}
LINQPAD 5可以下载这里。