在.NET开发中,了解程序集的编译配置是常见的需求,比如区分Debug和Release版本。可以通过两种属性来实现这一目的:DebuggableAttribute和AssemblyConfigurationAttribute。这两种属性都应用于程序集,并且可以在程序集清单中找到,但它们之间存在一些重要的差异。
AssemblyConfigurationAttribute 必须由程序员添加,它是可读的,而 DebuggableAttribute 是自动添加的,并且始终存在,但它不是人类可读的。
要获取程序集清单,可以使用Visual Studio的命令提示符中的ILDASM工具。通过双击清单项,可以查看所有的清单数据。
在清单数据中,可以找到DebuggableAttribute:
[module: System.Diagnostics.DebuggableAttribute( ... )]
以及可能的AssemblyConfigurationAttribute:
[assembly: System.Reflection.AssemblyConfiguration("Debug")]
AssemblyConfigurationAttribute 定位 - 这个属性很容易解释:它的值可以是Debug或Release。
DebuggableAttribute 如果没有AssemblyConfigurationAttribute,那么就必须使用DebuggableAttribute来实现目标。由于无法理解DebuggableAttribute的值,必须使用其他工具打开程序集并读取这个属性的内容。虽然没有现成的工具,但很容易创建一个命令行工具,并使用类似以下的方法:
private bool IsAssemblyDebugBuild(string filepath)
{
return IsAssemblyDebugBuild(Assembly.LoadFile(Path.GetFullPath(filepath)));
}
private bool IsAssemblyDebugBuild(Assembly assembly)
{
foreach (var attribute in assembly.GetCustomAttributes(false))
{
var debuggableAttribute = attribute as DebuggableAttribute;
if (debuggableAttribute != null)
{
return debuggableAttribute.IsJITTrackingEnabled;
}
}
return false;
}
或者(如果更喜欢LINQ):
private bool IsAssemblyDebugBuild(Assembly assembly)
{
return assembly.GetCustomAttributes(false).Any(x =>
(x as DebuggableAttribute) != null ?
(x as DebuggableAttribute).IsJITTrackingEnabled :
false);
}
如所见,这相当简单。