2010-06-29 122 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