探索程序集属性:DebuggableAttribute与AssemblyConfigurationAttribute

在.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); }

如所见,这相当简单。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485