在引用的C#库中,有没有办法知道父项目是Debug还是Release?

时间:2015-07-02 04:23:10

标签: c# asp.net asp.net-mvc msbuild

我有一个实用程序库,用于在C#中执行一些常见操作。

我想在项目根目录中的JSON文件中返回一个Assets数组,但结果会有所不同,具体取决于父项目是Debug还是Release。

例如:

{ProjectRoot} \ Assets.json

{
    "debug": {
        "css": [
            "/public/vendor/bootstrap/3.3.5/css/bootstrap.min.css"
        ],
        "js": [
            "/public/vendor/bootstrap/3.3.5/js/bootstrap.min.js",
        ]
    },
    "release": {
        "css": [
            "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"
        ],
        "js": [
            "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js",
        ]
    }
}

然后我通过检查DEBUG或RELEASE并将正确的列表返回给ViewBag来使用它。

我已经在几个项目中手动执行此操作,而我即将开始另一个项目。我想将它添加到实用程序项目中。但是,在库中设置#if DEBUG将返回库构建的正确文件,但不会返回父项目。

有没有办法让父项目构建是调试还是发布而没有其他预处理器包装?

为了简单起见,我只想设置ViewBag.Assets = MyLib.Assets,而不是在我的父项目中检查Debug或Release并包装ViewBag设置。

这有可能吗?

1 个答案:

答案 0 :(得分:2)

我快速而肮脏的解决方案

将属性放在自定义DLL中,如下所示:

    public bool IsDebug
    {
        get
        {
#if DEBUG
            return true;
#else 
            return false;
#endif                
        }
    }

3-Party-DDL可能只有be careful。正如戴夫·布莱克在博客中提到的那样:

  

首先,您需要准确定义" Debug"的含义。 vs."发布" ...

object[] attribs = ReflectedAssembly.GetCustomAttributes(typeof(DebuggableAttribute), 
                                                        false);

// If the 'DebuggableAttribute' is not found then it is definitely an OPTIMIZED build
if (attribs.Length > 0)
{
    // Just because the 'DebuggableAttribute' is found doesn't necessarily mean
    // it's a DEBUG build; we have to check the JIT Optimization flag
    // i.e. it could have the "generate PDB" checked but have JIT Optimization enabled
    DebuggableAttribute debuggableAttribute = attribs[0] as DebuggableAttribute;
    if (debuggableAttribute != null)
    {
        HasDebuggableAttribute = true;
        IsJITOptimized = !debuggableAttribute.IsJITOptimizerDisabled;
        BuildType = debuggableAttribute.IsJITOptimizerDisabled ? "Debug" : "Release";

        // check for Debug Output "full" or "pdb-only"
        DebugOutput = (debuggableAttribute.DebuggingFlags & 
                        DebuggableAttribute.DebuggingModes.Default) != 
                        DebuggableAttribute.DebuggingModes.None 
                        ? "Full" : "pdb-only";
    }
}
else
{
    IsJITOptimized = true;
    BuildType = "Release";
}

这个问题在这里经常被问到: