如何确定程序集是如何构建的?

6

我正在使用VS2010/2012,想知道是否有一种方法(可能使用反射)来查看程序集是如何构建的。

在调试时,我使用#if DEBUG将调试信息写入控制台。

然而,当你拥有一堆程序集时,有没有一种方法可以查看它们是如何构建的?获取版本号很容易,但我一直没有找到如何检查构建类型的方法。


2
“检查构建类型”是什么意思? - Kippie
2
你真正想要了解什么?(条件编译符号?优化选项?调试选项?) - Jon Skeet
你能澄清一下你想要实现什么吗? - Luis Filipe
3
如何检查程序集是使用Debug还是Release配置构建的? - Dennis
@Dennis,我以为我已经彻底搜索过了 - 显然不是,抱歉,但你绝对是正确的。 - Verakso
@Verakso,你看了我的回答吗? - giammin
2个回答

3
一旦编译完成,除非您自己添加元数据,否则无法更改。
例如,您可以使用 AssemblyConfigurationAttribute 或 .NET 4.5 的 AssemblyMetadataAttribute
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif

或者

#if DEBUG
[assembly: AssemblyMetadata("DefinedVariable", "DEBUG")]
#endif

3
有三种方法:
private bool IsAssemblyDebugBuild(string filepath)
{
    return IsAssemblyDebugBuild(Assembly.LoadFile(Path.GetFullPath(filepath)));
}

private bool IsAssemblyDebugBuild(Assembly assembly)
{
    foreach (var attribute in assembly.GetCustomAttributes(false))
    {
        var debuggableAttribute = attribute as DebuggableAttribute;
        if(debuggableAttribute != null)
        {
            return debuggableAttribute.IsJITTrackingEnabled;
        }
    }
    return false;
}

或者使用程序集元数据:

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

或者在代码中使用带有 #if DEBUG 的常量

#if DEBUG
        public const bool IsDebug = true;
#else
        public const bool IsDebug = false;
#endif

我更喜欢第二种方式,这样我既可以通过代码阅读,也可以通过Windows资源管理器查看。

我看到了你的答案,但我也阅读了原始帖子和博客文章,最终得出了一个略微修改过的 IsAssemblyDebugBuild 版本,如下所示: return assembly.GetCustomAttributes(false).Any(x => (x as DebuggableAttribute) != null ? (x as DebuggableAttribute).IsJITTrackingEnabled : false); - Verakso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接