2008-09-17 35 views
1

以下是該場景:兩臺機器上的相同源代碼產生不同的可執行行爲

保存在SVN中的C#Windows應用程序項目用於創建可執行文件。通常,構建服務器會處理構建過程並按定期間隔創建構建,供測試使用。在這個特定的例子中,我被要求修改一個特定的版本並創建可執行文件。

我不完全確定構建服務器是否會修改項目文件,但我知道它會在用於編譯可執行文件的源代碼的SVN中創建一個標記。使用該標籤,我已經在另一臺機器上檢查了代碼,這是一臺開發機器。然後我在開發機器上編譯源代碼。

執行時,在開發計算機上編譯的應用程序的功能與構建服務器編譯的應用程序不完全相同。例如,在測試機器上,應用程序檢測到DateTime Parse的錯誤。但是,生成機器的可執行文件不會引發任何解釋。如果我在開發機器上運行可執行文件,則不會引發異常。

因此,總之,兩臺機器理論上都使用相同的源代碼和項目。
開發機器的可執行文件只能在開發機器上運行。生成機器的可執行文件適用於每臺機器,包括開發機器。

機器的區域設置或時區是否存儲在編譯好的可執行文件中?任何想法可能會導致這種行爲或如何檢查可執行文件以找出可能的差異並糾正它們?

不幸的是,我不能拿一個測試機器,並附加一個調試器。只要我願意,我會盡快。

回答

4

該應用程序使用它運行的機器的區域設置,它看起來像是你的問題。通過將System.Threading.Thread.CurrentThread.CurrentCulture和System.Threading.Thread.CurrentThread.CurrentUICulture設置爲特定值,可以強制線程使用特定的區域性。

1

你能在調試器下運行生成機器上的程序嗎?

如果是這樣,那麼調試問題 - 有沒有必要猜測

讓開發機器上的調試器發現異常,在構建機器上的相同位置設置一個斷點。看看這兩者之間有什麼不同。

+0

目前我無法在任何測試機器上運行調試器。我會盡快這樣做。 – 2008-09-17 20:03:43

2

這兩個機器可能具有不屬於您的構建過程的基礎dll的不同版本。在我們的內部服務器羣中分配服務時,我看到了這種情況。

+0

我檢查過,兩個外部DLL都是相同的二進制文件。 (還是)感謝你的建議。 – 2008-09-17 20:08:23

0

我曾經有過類似的問題(除了在C++中)當我比較編譯的可執行文件的大小時,他們離開了。不幸的是,經過幾天的搜索,我發現的最佳解決方案是卸載VS05並重新安裝。

1

我在XP上看到過不同的「區域和語言選項」會導致這種行爲。這兩個機器匹配嗎?開始|設置|控制面板|區域和語言選項...

0

爲什麼你使用生成服務器反正C#代碼,如果我可能會問?

當我使用它時,C#的編譯時間幾乎不可知(< 2s)。應用程序真的很大嗎?

+0

創建自動發佈到測試的構建。在這個特殊情況下,我被要求在其中一臺開發機器上單獨構建一個測試來測試某個特定分支點的一些變化。 – 2008-09-17 20:05:03

1

我有幾個問題 - 兩臺機器是否具有相同的區域設置,以及您的錯誤日誌在哪裏?我希望;-)你有異常處理和寫入磁盤,事件日誌..有助於這樣的問題。

日期來自哪裏正在解析?如果它在你的分貝,也許你也有不好的數據。

+0

日期來自數據庫,正在處理異常,它向用戶顯示警告消息。我不完全確定它是否將事件寫入事件查看器或單獨的日誌文件。我剛剛在一週前開始編寫這個應用程序。 – 2008-09-17 20:07:11

0

構建系統可能會發布版本,而手動構建在dev PC上會生成一個調試版本。調試版本中有更多的錯誤檢查。看看你是否可以手動構建發佈版本並查看是否仍然存在差異。

0

如果每個程序都在不同的計算機上生成相同的程序,則很少有相同的源代碼。你應該總是假定節目是不同的,永遠不要期望它們是相同的。在像linux這樣的環境中,有一個良好的包管理器和定期或隨機更新,不要期望相同的源代碼在同一臺計算機上構建相同的程序。語言越高越差。爲調試器構建程序與爲發佈構建完全不同。即使沒有調試器,調試器版本也會隱藏您在發佈版本之前找不到的錯誤。如果您太依賴調試器環境,基本上可以調試兩次程序。

相關問題