2012-01-03 77 views
0

我公司的一些人正在爭論它。給定源代碼和編譯器(使用相同的標誌/開關進行編譯),編譯器是否可能創建在不同操作系統中具有不同行爲的二進制文件?相同的編譯器在不同的操作系統上創建不同的行爲

具體來說,我們有一個C#項目,它必須在Windows XP和Windows 7中都運行,都是32位。編譯器是VS 2008.有一個解決方案文件(* .sln),其中包含我們用來構建軟件的所有必需文件,程序集,項目等。

是否有可能的是,如果碼(同一溶液文件)在2008年VS被編譯(具有相同的標誌/開關,因爲它是相同的溶液文件)的XP會產生一個二進制這將有行爲差異比在Windows 7中編譯的二進制文件?

通過行爲差異我的意思是,在特定情況下...

  • 預期在XP中的XP版本將運行
  • 如預期在Win 7
  • 的勝利7版本將運行XP版本可能會導致在Win 7中出現錯誤(可能是崩潰或某些意外行爲),反之亦然

該項目太龐大而無法提出一個小測試項目。如果以上情況屬實,我想知道是什麼情況(如果有的話)。

+3

什麼是「bug」? – 2012-01-03 04:56:10

+0

構建有問題的二進制文件。做一個二進制比較。看看有什麼不同。我希望他們會一樣。確保僅構建版本版本。否則,將機器特定的信息添加到二進制文件和pdb中。 – AMissico 2012-01-03 04:58:34

+1

調用只存在於Windows 7中的本機API方法時想到了。 – sq33G 2012-01-03 04:58:49

回答

5

鑑於VS2008的相同的安裝,包括Service Pack,並給予相同的框架,包括服務包,在測試機器,答案是沒有。

但是,這並不意味着沒有應用程序執行的任務會在不同的操作系統上表現不同。

您還必須考慮操作系統對應用程序(防火牆,DEP,UAC等)的不同響應可能會暴露應用程序中某個操作系統上不存在的缺陷。

然後是非託管代碼問題,這是另一個話題。而且,當我們處理它時,來自應用程序的本地OS調用可能會導致不穩定。

但是沒有一個是由於編譯器在開頭句中給出了約束條件。

2

簡單的回答:沒有。

由於情況不同,更常見的是您的應用程序失敗。例如,缺少庫,文件,註冊表項;不插電的設備。

希望你不是在做一些奇怪的事情是這樣;)

if (DateTime.Now.Year != 2012) 
    throw new Exception(); 
+0

根據編譯時間,該代碼爲什麼會產生不同的行爲? 'DateTime.Now'不是編譯時嵌入到代碼中的常量值,它在運行時動態讀取。 – 2012-01-03 05:06:33

+0

@Code Gray:改說,不是我的意思:) – Matthias 2012-01-03 05:07:31

1

簡單的答案是否定的。無論機器或操作系統如何,編譯器的本質都是基於相同的代碼生成相同的程序集。

想象一下,如果這不是真的會發生什麼?你將不得不有不同的操作系統和各種服務包或其他任何獨立的生成機器。

相關問題