#if(DEBUG)在定制的基类库中不起作用

时间:2013-08-15 07:52:33

标签: c# .net windows winforms .net-assembly

我在VS 2010 C#中创建了一个Windows应用程序。它是一个Web爬虫应用程序并使用 N层应用程序结构(一个Windows应用程序和许多类库 项目)。上周我在所有项目中实现了一个Log系统,用于创建日志文本 解决性能问题。但现在我想在发布模式下禁用此日志功能。

我用Google搜索并从CodeProject获取示例。请参阅下面的代码。

public class ModeDetector
{
    public virtual bool IsDebug
    {
        get
        {
            bool isDebug = false;

            #if (DEBUG)
            isDebug = true;
            #else
            isDebug = false;
            #endif

            return isDebug;
        }
    }

    public bool IsRelease
    {
        get { return !IsDebug; }
    }
}

我在基类库中创建了这个类。获取此类供所有参考 项目。我在我的Windows应用程序中调用此方法。像

if (new Sun.lib.ModeDetector().IsDebug)
            MessageBox.Show("Debug Mode");
        else
            MessageBox.Show("Release Mode");

并将我的项目Build Configuration更改为“Release”。但是这段代码总是显示“调试模式”消息。但是当我在我的Windows应用程序中创建这个类时,它的工作正常。但我太担心在每个项目中创建这个类。

请告诉我确定项目工作调试或发布模式的最佳做法是什么。我如何在整个项目中使用此类。

编辑:

我在类库项目的Debug bug文件夹中引用类库。

我的类库和win表单应用程序都在相同的解决方案上。

3 个答案:

答案 0 :(得分:1)

每个库设置DEBUG标志,而不是每个解决方案。您需要在解决方案中使用的每个库中设置(或删除)该标志。

答案 1 :(得分:1)

您很可能尝试重新创建类似于Debug.XXXX方法中使用的条件属性。如果未定义给定符号,Conditional attributes允许方法调用no-op。

即。查看调试版本中跟踪的Debug.Write方法(定义{{​​1}}时)和发布版中的no-op:

DEBUG

请注意,您将无法实现所需的虚函数,因为具有条件属性的方法将根据条件符号调用或不调用,但方法内部的代码不会发生变化。

[ConditionalAttribute("DEBUG")] public static void Write(Object value) 更改将编译的代码。编译的DLL只有一个分支(匹配条件)。

您需要在发布和调试版本中引用匹配的库。如果您对所有项目使用单一解决方案,它将自动设置,如果您有单独的解决方案,我相信您需要手动编辑“.csproj”文件,以根据定义包含库的不同版本。

答案 2 :(得分:0)

谢谢Marcus。我按照你的指示重写我的代码,如:

#if (DEBUG) 

    MessageBox.Show("Debug Mode");

#else

    MessageBox.Show("Release Mode");

#endif