Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual Studio 2008是否能够对C#进行条件编译?_C#_Visual Studio_Debugging_Build_Projects And Solutions - Fatal编程技术网

Visual Studio 2008是否能够对C#进行条件编译?

Visual Studio 2008是否能够对C#进行条件编译?,c#,visual-studio,debugging,build,projects-and-solutions,C#,Visual Studio,Debugging,Build,Projects And Solutions,参考构建菜单下的“配置管理器” 有没有一种方法可以注释我的C#代码,使注释掉的代码在解决方案处于调试模式时不会编译,但在我将其更改为发布模式时会编译 我为什么要这个?我想要在发布模式下编译代码,而不是在调试模式下编译代码的原因是,我有一些代码无法在我的开发PC上运行(从我的主机发送电子邮件的代码,等等) 我希望这是自动的,而不必在发布之前重新运行代码和取消注释行。您可能正在寻找类似的内容: #if DEBUG Console.WriteLine("Debug Mode"); #else

参考构建菜单下的“配置管理器”

有没有一种方法可以注释我的C#代码,使注释掉的代码在解决方案处于调试模式时不会编译,但在我将其更改为发布模式时会编译

我为什么要这个?我想要在发布模式下编译代码,而不是在调试模式下编译代码的原因是,我有一些代码无法在我的开发PC上运行(从我的主机发送电子邮件的代码,等等)


我希望这是自动的,而不必在发布之前重新运行代码和取消注释行。

您可能正在寻找类似的内容:

#if DEBUG
     Console.WriteLine("Debug Mode");
#else
     Console.WriteLine("Release Mode");
#endif
如果您只关心发布模式,则可以使用:

#if !DEBUG
     Console.WriteLine("Release Mode");
#endif
为此,可以对方法(但不是单独的代码行)使用条件属性

例如,以下内容将仅编译为调试版本

[Conditional("DEBUG")]
public void MyMethod()
{
    // Do Stuff
}
调试符号已在项目设置中指定。您必须为发布版本创建自己的符号,比如“release”,以便执行以下操作:

[Conditional("RELEASE")]
public void MyMethod()
{
    // Do Stuff
}

但是,我建议退一步,从更高的层次重新审视您的问题,因为我不会真正推荐这种解决方案。

我可能错了,但我认为编译器会忽略注释。如果我使用查看我的程序集,我不会看到任何我知道存在的注释

BlueMonkMN的方法可以根据编译模式运行不同的代码

如果您希望根据所使用的编译模式(和其他变量)运行不同的代码,请签出。它是一个编译后编译器,可以添加和删除程序集的代码

示例用法: -我喜欢为我的项目提供详细的调试和跟踪信息。 -我讨厌
打印
跟踪。在每个方法结果或方法调用之后编写
语句,因为这些额外的调试代码会使执行工作的函数变得模糊


您可以配置PostSharp动态创建此额外调试信息!通过几个配置调整,您可以打印每个函数的每个调用以及每个调用的结果(包含可变内容)。这使得遵循程序逻辑流程非常容易。

我将尝试使用面向对象技术解决您的问题。使用,我将构造一个执行必要调试操作的类

比如:

public class MyClass {

    public MyClass(IDoOtherStuff stuffToDo) {
        DoOtherStuff = stuffToDo;
    }

    private IDoOtherStuff DoOtherStuff { get; set; }

    public void Do() {
        DoOtherStuff.BeforeDo();

        // Blah blah blah..

        DoOtherStuff.AfterDo();
    }
}

public interface IDoOtherStuff {
    void BeforeDo();
    void AfterDo();
}

public class DebugOtherStuff : IDoOtherStuff {
    public void BeforeDo() {
        Debug.WriteLine("At the beginning of Do");
    }

    public void AfterDo() {
        Debug.WriteLine("At the end of Do");
    }
}

public class ReleaseOtherStuff : IDoOtherStuff {
    public void BeforeDo() { }
    public void AfterDo() { }
}

现在,您可以使用诸如、、或之类的容器来配置您的开发环境,而不是发布环境。

我想说,这个解决方案和我的解决方案存在同样的问题。我不推荐。我建议将问题作为一个整体来看待,看看是否有其他方法来解决更大的问题。代码中充斥着大量的#if语句或条件属性肯定会给任何维护程序员(甚至是你自己在几个月内!)造成很多混乱,为什么你会认为调试符号被错误使用?默认情况下,它会添加到每个项目中,并且框架也会使用它,所以它肯定是要被使用的。我确实发现,只在发布模式下编译一些代码而不在调试模式下编译(通常情况下是相反的),这有点不寻常,但是在发布模式和调试模式之间编译不同的代码是环境的一个有意且有用的特性。偶尔使用条件编译标志没有什么错。我同意当你看到的不止一把的时候,这是令人困惑的,尽管这就是它。。。非常感谢。只是想在调试模式和发布模式下隐藏一些代码。很好!我理解这些保留意见。在这种情况下,我只有几个用途。只有几行代码试图从我的主机发送电子邮件——这在我的开发环境中不起作用。只是不想在发布前通过我的代码来取消注释。谢谢你在“条件编译”中寻找的术语。从你的更新来看,我认为条件编译并不是你真正想要的。这是你所要求的,而不是你所需要的。您需要一个为您的开发环境运行的配置,一个在QA中运行,另一个在生产中运行。我真的倾向于配置或面向对象的解决方案。。。“我想不太清楚这个词。”杰夫,我完全同意。这听起来像是一个过早的优化。不是优化,只是有几行我不想在调试模式下运行的代码,因为它们不会工作并导致异常。不想在发布前返回到取消注释代码。请重新阅读问题。他想要条件编译,但不知道它的存在。这不是我想要的直接解决方案,但很高兴知道。谢谢。+1将DI作为解决方案,虽然可能不是解决此问题的正确方法,但我相信它可以解决大多数条件编译问题。。。也解释得很好。