如何检查程序集是否使用Debug或Releaseconfiguration?

我开始部署我的Web应用程序,我需要保证将要部署的所有程序集都是使用发布configuration构build的。 我们的系统是使用C#/ .Net 3.5开发的。

有没有办法做到这一点?

检查这个 。 这个想法是,你使用Assembly.GetCustomAttributes()获得程序集属性列表,然后searchDebuggableAttribute ,然后查找这个属性是否具有IsJITTrackingEnabled属性集。

  public bool IsAssemblyDebugBuild(Assembly assembly) { return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled); } 

我喜欢David的build议,但是你也可以这样( AssemblyInfo.cs ):

 #if DEBUG [assembly: AssemblyDescription("Your application assembly (DEBUG version)")] #else if RELEASE [assembly: AssemblyDescription("Your application assembly (RELEASE version)")] #endif 

这更友好,因为任何人都可以右键单击该程序集,select“ Properties并转到“ Details选项卡。

如果是你的程序集,我相信使用AssemblyConfiguration属性是最好的方法。 它被logging为“为程序集指定构buildconfiguration,例如零售或debugging”。

根据你的构buildconfiguration,你可能有这样的代码:

 #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. Schreurs在鲁本斯·法里亚斯(Rubens Farias)的评论也是如此,但是在看到评论之前我已经在其他地方find了这个信息,所以我相信这需要一个更重要的条目,而不是一个完整的回应)

如果安装了Reflector,则还可以单击该程序集并在反汇编程序窗格中查找可debugging属性([assembly:Debuggable()])。

假设只有Debug和Releaseconfiguration,DEBUG符号默认使用Debugconfiguration来定义,所以下面的代码在AssemblyInfo.cs中(属性文件夹下)。

 #if DEBUG [assembly: AssemblyTitle("Debug")] #else [assembly: AssemblyTitle("Release")] #endif 

我在AssemblyDescription上使用AssemblyTitle,因为它会显示在我的Windows 7文件资源pipe理器属性中:

DLL文件属性

对于那些喜欢David和stevieg的回答,这里是用C#编写的LINQPad脚本。 要使用该脚本,您需要下载LINQPad 5并确保select了C#程序,如下面的屏幕截图所示。

只需将DLL_FOLDER_PATHreplace为指向包含要检查的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; } } } 

使用LINQPad5检查版本或调试版本

LINQPAD 5可以在这里下载。

不要通过Visual Studio部署到生产环境。 看看持续集成和脚本构build(例如与NAnt ,或者更像FAKE更清晰)。

F5键不是一个构build过程

对于那些认为这不能回答这个问题的诽谤者,OP写道:

…我需要保证所有要部署的程序集都是使用Releaseconfiguration构build的。

为了保证这一点,可以使用TeamCity等构build服务器,也可以使用Octopus Deploy等发布pipe理工具。 locking您的生产系统,以便开发人员必须完成正式的生成过程。