多年来,我一直使用VB.NET中的DEBUG编译器常量将消息写入控制台。我也以类似的方式使用了System.Diagnostics.Debug.Write。总是我的理解是,当RELEASE被用作构建选项时,所有这些语句都被编译器省略了,从而释放了生产代码中的调试语句开销。最近,在使用Silverlight 2 Beta 2时,我注意到Visual Studio实际上连接到一个RELEASE构建版本,我从一个公共网站上运行并显示我认为甚至没有编译的DEBUG语句!现在,我的第一个倾向是假设我的环境出了问题,但我也想问问任何对System.Diagnostics.Debug和DEBUG构建选项有深入了解的人,一般情况下我可能会误解这里。.NET Compiler - DEBUG vs. RELEASE
回答
的首选方法是实际使用条件属性来包装您的调试调用,而不是使用编译器指令。 #if可能会变得棘手,并可能导致奇怪的构建问题。
使用条件属性的例子如下(在C#中,但在VB.NET太工作):
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
// do stuff
}
当你编译没有调试标志设置,以WriteDebug任何通话将被删除正如在Debug.Write()中所假设的那样。
根据我的经验,在VB.NET中调试和发布之间的选择没有区别。您可以将自定义操作添加到两个配置中,但默认情况下我认为它们是相同的。
使用发行版肯定不会删除System.Diagnostics.Debug.Write语句。
它们不一样;并且由于将ConditionalAttribute应用于该方法,默认情况下释放模式实际上将删除对Debug.Write的调用。 – 2008-10-11 21:21:56
我要做的就是封装调用调试在我自己的类,并添加一个预编译器指令
public void Debug(string s)
{
#if DEBUG
System.Diagnostics.Debug(...);
#endif
}
使用DEBUG编译符号会,就像你说的,其实忽略从组件的代码。
我相信System.Diagnostics.Debug.Write将始终输出到附加的调试器,即使您已经构建在发布模式下。根据MSDN article:
将有关调试的信息写入Listeners集合中的跟踪侦听器。
如果你不希望任何输出做,你需要换你的电话与像胡安的DEBUG常量Debug.Write说:
#if DEBUG
System.Diagnostics.Debug.Write(...);
#endif
我也读过这篇文章,它让我相信,当DEBUG没有被定义时,在System.Debug函数中声明的ConditionalAttribute会导致编译器完全忽略这段代码。对于TRACE,我认为同样的事情是正确的。也就是说,System.Diagnostics.Debug函数必须具有DEBUG和TRACE的ConditionalAttributes。我在这个假设上错了。单独的Trace类具有相同的功能,并且这些定义了依赖于TRACE常量的ConditionalAttribute。
从System.Diagnostics.Debug: _ 公共共享子写入(_ 消息作为字符串_ )
从System.Diagnostics程序。跟踪: _ 公共共享子的WriteLine(_ 消息作为字符串_ )
看来那时,我原来的设想是正确的,那System.Diagnostics.Debug(或system.Diagnostics.Trace)声明实际上是不包含在编译中,就好像它们包含在#IF调试(或#IF TRACE)区域中一样。
但我也从你们这里了解到,并验证过,RELEASE构建本身并没有考虑到这一点。至少在Silverlight项目中,这些项目仍然有点片面,您需要进入“高级编译选项...”并确保DEBUG未定义。
我们从.NET 1.1/VS2003跳到.NET 3.5/VS2008,所以我认为其中一些用于不同的工作,但也许它在2.0/VS2005中有所变化。
检查Debug.Write方法。它标有
[Conditional("DEBUG")]
属性。
的MSDN帮助ConditionalAttribute状态:
表示该方法调用 或属性应该被忽略 除非指定条件 编译符号定义编译器。
构建配置是否具有释放或调试标签无关紧要,重要的是DEBUG符号是否在其中定义。
要选择是否要调试信息进行编译或被删除,
进入项目的属性窗口中的“生成”选项卡。
选择合适的配置(主动/发行/调试/全部),并确保您 选中“DEBUG常数”如果你想要的信息, 或取消它,如果你不这样做。
应用更改并重建
- 1. Visual Studio - Debug vs Release
- 2. 调试时XCode debug vs release版本
- 3. android release apk大于debug apk
- 4. 为什么Debug&Release为.Net构建,但不适用于Java?
- 5. Bin/Debug和Bin/Release之间的区别
- 6. DEBUG VS _DEBUG
- 7. .NET 4.0 Release Candidate
- 8. 静态成员变量未在Release - Compiler/clr bug中初始化?
- 9. 如何在Debug/Release模式下构建Sqlite二进制文件
- 10. web.config,web.debug.config,web.release.config&Publish vs Debug?
- 11. QTCreator .pro文件:根据DEBUG/RELEASE设置LIBS路径
- 12. WCF:自动禁用MEX从DEBUG到RELEASE在VS2010中生成?
- 13. Debug和Release版本的键盘快捷键
- 14. Flex 4.5:bin-debug可以工作,但bin-release不会
- 15. 如何在同一设备上同时安装Debug和Release apk?
- 16. 为什么Debug构建失败而Release构建成功?
- 17. 应用程序验证器DEBUG或RELEASE模式?
- 18. 为什么找不到MvvmCross-Binaries \ XS-iOS-Mac \ bin [Debug | Release]?
- 19. 在DEBUG模式下工作,但在RELEASE模式下失败
- 20. #if RELEASE会像#if DEBUG那样在C#中工作吗?
- 21. iPhone Xcode RELEASE配置构建错误 - 但DEBUG工作正常
- 22. Release和Debug模式下的项目设置?
- 23. 在Objective-C中,除DEBUG外还有RELEASE定义吗?
- 24. 如何为TeamCity项目构建Debug和Release
- 25. 如何防止Cmake在EXECUTABLE_OUTPUT_PATH下创建Debug/Release文件夹?
- 26. Flex bin-debug行间距与bin-release不同
- 27. 在Delphi 7中,我可以设置'Debug'和'Release'模式吗?
- 28. 如何在Debug和Release之间进行编译?
- 29. CTP5 vs release 4.1 EF多对多关系
- 30. self.property to nil vs [ivar release] case close
真棒...爱学习新的小技巧! – BigBlondeViking 2009-07-09 14:01:33