如何使用Debug或Release配置检查程序集是否已构建?

时间:2010-02-02 18:34:14

标签: c# assemblies build-process release-mode debug-mode

我正在开始部署我的Web应用程序,我需要保证所有要部署的程序集都是使用Release配置构建的。我们的系统是使用C#/。Net 3.5开发的。

有没有办法实现这个目标?

6 个答案:

答案 0 :(得分:39)

检查this。我们的想法是使用Assembly.GetCustomAttributes()获取程序集属性列表并搜索DebuggableAttribute,然后查找此属性是否设置了IsJITTrackingEnabled属性。

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

答案 1 :(得分:26)

我喜欢David这个建议,但你也可以这样做(AssemblyInfo.cs):

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

这更加人性化,因为任何人都可以右键单击该程序集,选择Properties并转到Details标签。

答案 2 :(得分:7)

如果是你的程序集我相信使用AssemblyConfiguration属性是最好的方法。它被记录为&#34;指定程序集的构建配置,例如零售或调试。&#34;

根据您的构建配置,您可能拥有以下代码:

#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的评论也是如此,但在看到评论之前,我已经在其他地方找到了这些信息,所以我认为这需要更重要的条目,如完整的回复,而不是评论)

答案 3 :(得分:2)

如果安装了Reflector,您还可以单击程序集并在Disassembler窗格中查找debuggable属性([assembly:Debuggable()]。

答案 4 :(得分:2)

假设只有Debug和Release配置,DEBUG符号默认使用Debug配置定义,所以下面的代码在AssemblyInfo.cs中(在Properties文件夹下)。

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

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

DLL File properties

对于那些喜欢David和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;
        }
    }
}

Checking release or debug build using LINQPad5

LINQPAD 5可以下载here

答案 5 :(得分:-1)

不要通过Visual Studio部署到生产环境。查看Continuous Integration和脚本版本(例如使用NAnt,或者更像是FAKE更清晰的内容。)

The F5 Key Is Not a Build Process

对于那些认为这不回答问题的批评者,OP写道:

  

......我需要保证所有的装配   部署是使用Release配置构建的。

保证,请使用TeamCity等构建服务器以及Octopus Deploy等版本管理工具。锁定生产系统,以便开发人员必须完成正式的构建过程。