我正在开始部署我的 Web 应用程序,我需要保证将要部署的所有程序集都是使用发布配置构建的。我们的系统是使用 C#/.Net 3.5 开发的。
有什么办法可以做到这一点?
我正在开始部署我的 Web 应用程序,我需要保证将要部署的所有程序集都是使用发布配置构建的。我们的系统是使用 C#/.Net 3.5 开发的。
有什么办法可以做到这一点?
检查这个。这个想法是您使用Assembly.GetCustomAttributes()
和搜索获取程序集属性列表,DebuggableAttribute
然后查找此类属性是否IsJITTrackingEnabled
设置了属性。
public bool IsAssemblyDebugBuild(Assembly assembly)
{
return assembly.GetCustomAttributes(false).OfType<DebuggableAttribute>().Any(da => da.IsJITTrackingEnabled);
}
我喜欢大卫的建议,但你也可以这样(AssemblyInfo.cs
):
#if DEBUG
[assembly: AssemblyDescription("Your application assembly (DEBUG version)")]
#else if RELEASE
[assembly: AssemblyDescription("Your application assembly (RELEASE version)")]
#endif
这更人性化,因为任何人都可以右键单击该程序集,选择Properties
并转到Details
选项卡。
如果是您的程序集,我相信使用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 评论也这么说,但我在看到评论之前已经在其他地方找到了这些信息,所以我认为这需要一个更重要的条目,比如完整的回复而不是评论)
如果您安装了 Reflector,您还可以单击程序集并在 Disassembler 窗格中查找可调试属性 ([assembly: Debuggable()])。
假设只有 Debug 和 Release 配置,DEBUG 符号默认使用 Debug 配置定义,因此 AssemblyInfo.cs 中的以下代码(在 Properties 文件夹下)。
#if DEBUG
[assembly: AssemblyTitle("Debug")]
#else
[assembly: AssemblyTitle("Release")]
#endif
我在 AssemblyDescription 上使用 AssemblyTitle,因为它会显示在我的 Windows 7 文件资源管理器属性中:
对于那些喜欢 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;
}
}
}
LINQPAD 5 可以在这里下载。
不要通过 Visual Studio 部署到生产环境。研究持续集成和脚本构建(例如使用NAnt,或者像FAKE这样更易读的东西)。
对于认为这不能回答问题的批评者,OP 写道:
...我需要保证将要部署的所有程序集都是使用发布配置构建的。
为保证这一点,请使用诸如TeamCity之类的构建服务器和可能的诸如Octopus Deploy之类的发布管理工具。锁定您的生产系统,以便开发人员必须通过正式的构建过程。