在“生成”菜单下的“配置管理器”中,
有没有一种方法可以注释我的C#代码,使得在调试模式下解除注释的代码不会被编译,但是如果我将其改为发布模式,则可以编译?
为什么我想要这个?我想要在发布模式下编译代码,但在调试模式下不编译的原因是,我有一些代码无法从我的开发PC工作(发送电子邮件等来自我的主机的代码)。
我希望这是自动完成的,而不是在发布之前运行回我的代码并取消注释行。
在“生成”菜单下的“配置管理器”中,
有没有一种方法可以注释我的C#代码,使得在调试模式下解除注释的代码不会被编译,但是如果我将其改为发布模式,则可以编译?
为什么我想要这个?我想要在发布模式下编译代码,但在调试模式下不编译的原因是,我有一些代码无法从我的开发PC工作(发送电子邮件等来自我的主机的代码)。
我希望这是自动完成的,而不是在发布之前运行回我的代码并取消注释行。
你可以在方法上使用条件属性(而不是单独的代码行)来实现这个目的。
例如,以下内容只会在DEBUG版本中编译。
[Conditional("DEBUG")]
public void MyMethod()
{
// Do Stuff
}
在项目设置中已经指定了DEBUG符号。对于发布版本,您需要创建自己的符号,例如“RELEASE”,这样您就可以执行以下操作:
[Conditional("RELEASE")]
public void MyMethod()
{
// Do Stuff
}
然而,我建议您退一步,从更高的层次重新审视您的问题,因为我不会真正推荐这种解决方案。
你可能在寻找类似于这样的东西:
#if DEBUG
Console.WriteLine("Debug Mode");
#else
Console.WriteLine("Release Mode");
#endif
如果你只关心发布模式,你可以使用:
#if !DEBUG
Console.WriteLine("Release Mode");
#endif
像这样:
```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() { }
}
我可能错了,但我认为编译器会忽略注释。如果我使用.NET Reflector查看我的汇编代码,我看不到我知道存在的任何注释。
BlueMonkMN的方法可以根据编译模式运行不同的代码。
如果您想要根据使用的编译模式(和其他变量)运行不同的代码,请查看PostSharp。它是一个后编译编译器,可以为您的程序集添加和删除代码。
示例用法:
- 我喜欢为我的项目提供详细的调试和跟踪信息。
- 我讨厌在每个方法结果或方法调用之后加上print
或trace.write
语句,因为这些额外的调试代码会遮盖执行工作的函数。
您可以配置PostSharp动态创建此额外的调试信息!进行一些配置调整,您就可以打印每个函数调用以及每个调用的结果(包括变量内容)。这使得跟踪程序逻辑流程非常容易。