47

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

有什么办法可以做到这一点?

4

6 回答 6

47

检查这个。这个想法是您使用Assembly.GetCustomAttributes()和搜索获取程序集属性列表,DebuggableAttribute然后查找此类属性是否IsJITTrackingEnabled设置了属性。

    public bool IsAssemblyDebugBuild(Assembly assembly)
    {
        return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
    }
于 2010-02-02T18:38:16.210 回答
30

我喜欢大卫的建议,但你也可以这样(AssemblyInfo.cs):

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

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

于 2010-02-02T19:04:56.463 回答
10

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

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

#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;
}

(我知道 Rubens Farias 的 R. Schreurs 评论也这么说,但我在看到评论之前已经在其他地方找到了这些信息,所以我认为这需要一个更重要的条目,比如完整的回复而不是评论)

于 2014-11-03T15:34:17.033 回答
2

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

于 2011-06-29T15:14:01.880 回答
2

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

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

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

DLL 文件属性

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

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

LINQPAD 5 可以在这里下载。

于 2016-03-10T12:50:41.763 回答
0

不要通过 Visual Studio 部署到生产环境。研究持续集成和脚本构建(例如使用NAnt,或者像FAKE这样更易读的东西)。

F5 键不是构建过程

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

...我需要保证将要部署的所有程序集都是使用发布配置构建的。

保证这一点,请使用诸如TeamCity之类的构建服务器和可能的诸如Octopus Deploy之类的发布管理工具。锁定您的生产系统,以便开发人员必须通过正式的构建过程。

于 2010-02-02T18:40:25.157 回答