2010-06-29 93 views
15

我构建了一个windows服务,针对VS 2008中的.NET 2.0。我将其作为控制台应用程序运行以进行调试。Visual Studio - Debug vs Release

控制台应用程序运行良好。我把它放在我的本地计算机上作为服务,在调试模式下编译,仍然工作得很好。我准备立即发布,并且突然,当我将其设置为发布模式时,该服务编译并安装,但没有任何反应。 (根本没有服务代码正在运行)。我知道释放vs调试模式是属性配置设置,但似乎在发布模式下,即使当我检查定义DEBUG常量,取消选中优化代码,并将调试信息设置为“完整”时,它仍然在执行没有。

将其重新设置为调试模式,并再次像魅力一样工作。

(一点题外话,我想目标框架重置为3.5,以确保没有问题,太)

所以我的问题(按重要性排序)是这些:

  1. 将以任何方式使用我的“调试”版本会导致任何问题?

  2. 什么设置调试之间的不同,除了这三个我一直在试图改变已经释放?

  3. 这似乎是一个奇怪的错误给我,激起了我的好奇心。任何想法会导致这种情况?

编辑: 应该提到,我已经在使用自定义安装程序。基本上我编译程序(无论是调试还是发行版),然后使用相应的安装程序进行安装。

+0

您确定该服务正在安装(并正确,在此)在发布模式? – 2010-06-29 17:40:40

+0

您需要安装程序和Windows服务的自定义操作。更多信息:http://msdn.microsoft.com/en-us/library/d56de412(VS.80).aspx – 2010-06-29 17:43:45

+0

服务是否进入运行状态? EventLog中的任何内容? – 2010-06-29 17:45:18

回答

17

1)它可能,如果不是直接地,间接地这样通过使应用程序慢,使得它使用更多的存储器。

2)当在调试模式下运行时,有一些事情是工作方式不同,例如:

  • 代码编译一些额外的NOP指令,以便有在至少一个指令每个代码行的开始,这样就可以在任何一行放置一个中断点。

  • 指令可以在发布模式下重新排列,但不能在调试模式下重新排列,以便代码可以单步执行,结果将与源代码的确切顺序相对应。

  • 垃圾收集器的工作方式不同,它让引用在整个范围内生存,而不是仅在使用它们的时间内存活,以便可以在调试模式下查看变量,而不会在范围结束之前离开。

  • 异常包含更多的信息,并抛出时需要花费很多更长的时间来处理。

所有这些差异都比较小,但它们是实际的差异,它们在某些情况下可能很重要。

如果您发现调试模式和发布模式在性能上有很大差异,通常是因为代码有问题,例如,如果它正在抛出并捕获大量异常。如果代码中存在争用条件,它可能只会在释放模式下发生,因为在调试模式下会有一些额外开销,导致代码运行速度稍慢。

3)至于你的服务的问题是什么,我不知道,但它似乎并没有涉及代码如何在调试模式或释放模式下执行。代码会在任何情况下启动,如果代码出现问题,它将会崩溃,您可以在事件日志中看到它。

+0

谢谢,它似乎完美地工作,我只是继续前进,部署它的方式。我仍然很困惑发生了什么,但是,这不是代码。再次感谢。 :) – Brandi 2010-06-29 20:14:49

0

我不确定我可以对#1或#2说话,但是当我遇到这样的问题时,这是因为线程/并发性不正确。我不确定您的应用有多大,但这可能是一个很好的开始。

+0

乍得,尽管这些都是OP的有效问题,但我认为这可能不是问题;它很**更可能是一个配置/安装问题 – 2010-06-29 17:50:01

+0

它非常小,基本上是一个定时器,它在更新时调用一个函数。我非常确定线程的安全性不在于释放模式不起作用,它甚至不运行构造函数,而使用调试设置进行编译完美无瑕。一般来说,建议虽然,谢谢。 :) – Brandi 2010-06-29 18:02:14