我正在开始部署我的Web应用程序,我需要保证所有要部署的程序集都是使用Release配置构建的。我们的系统是使用C#/。Net 3.5开发的。
有没有办法实现这个目标?
答案 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文件资源管理器属性中:
对于那些喜欢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可以下载here。
答案 5 :(得分:-1)
不要通过Visual Studio部署到生产环境。查看Continuous Integration和脚本版本(例如使用NAnt,或者更像是FAKE更清晰的内容。)
The F5 Key Is Not a Build Process
对于那些认为这不回答问题的批评者,OP写道:
......我需要保证所有的装配 部署是使用Release配置构建的。
要保证,请使用TeamCity等构建服务器以及Octopus Deploy等版本管理工具。锁定生产系统,以便开发人员必须完成正式的构建过程。