2012-03-07 32 views
2

我的程序的用戶報告無法啓動應用程序。我還沒有解決問題,但我很困惑。無法在.NET 4.0的x64位機上加載資源時發生了什麼?

記錄仍然有效,所以我用日誌報表,並能縮小到崩潰一行在用戶控件的InitializeComponent:

this.Horizo​​ntalBox.Image = ((System.Drawing中。圖像)(resources.GetObject( 「Horizo​​ntalBox.Image」)));

以下是他的結局相關的線索:

  • 64位Windows 7
  • 正確的.NET Framework(4.0客戶端配置文件)
  • 沒有視覺元素不斷顯現,並沒有錯誤對話框。啓動時無聲關機。
  • 登錄工作,但沒有記錄錯誤。
  • 他已卸載並重新安裝.NET 4.0客戶端配置文件框架。
  • 他沒有任何Visual Studio或其他開發工具。

我花了一個星期左右的時間來消除理論,我變得困惑和絕望。這裏是我發現的相關細節和事情:

  • 我明確地針對x86。
  • 無法記錄任何異常的日誌記錄設置爲捕獲並記錄任何未處理的異常和線程異常終止。
  • 無論是殺死應用程序還會阻止程序基本入口點中的最終「關閉」日誌消息。
  • 我讀過某些圖標(.ICO)文件格式在Windows XP中不起作用。這是一個遙不可及的理論,因爲這是Windows 7.這是項目中ICO文件的唯一情況,所以我很懷疑並將其切換到PNG。沒有不同。我自從認爲圖像僅僅因爲它是從資源加載的第一個圖像而失敗。
  • 我讀過Form_Load事件可能吞下異常(並且僅在調試時)。此外,InitializeComponent()在構造函數中,所以理論不穩定。儘管如此,我在try/catch中將調用包裝爲InitializeComponent(),但catch和其關聯的日誌記錄永遠不會被調用。
  • 我已經在x86和x64之間看到關於資源編譯問題的文章,但是與運行時問題沒有關係。 (請參閱this post
  • 我認爲程序顯示問題時必定存在某些錯誤,因此我僅使用嵌入相關資源文件中的單個映像製作了WindowsFormsApplication1測試應用程序。這也無法以相同的方式加載。該測試應用程序也針對x86。
  • 它可以在其他x86和x64機器上正常工作!

他的機器上可能會發生什麼?爲什麼異常處理讓我失望?這個問題很瘋狂!

編輯:更多細節,我仍然感到困惑!

  • 我因爲發送構建爲86,64測試應用(單一形式,上面有一個單一的圖像),並且「任何CPU」。 x64和「任何Cpu」應用程序都可以工作。
+0

看起來像某種schroedingbug。難道是窗戶有點搞砸了嗎?因爲如果是這種情況,如果問題來自計算機系統本身,則可能無法調試您的程序。另外,請注意,一些異常是不可捕捉的,如果它們發生,就會使程序崩潰。 – squelos 2012-03-07 21:46:34

+0

前段時間我有類似的問題。我的應用程序使用基於Win7的ICO文件,突然在XP上崩潰。我用PNG取代了ICO文件,一切進展順利。系統事件日誌說什麼?你能遠程登錄到機器嗎?你可以使用WinDBG/SOS進行調試,看看到底發生了什麼。如果您無法遠程調試它,請讓您的用戶爲您運行該軟件並創建一個完整的轉儲文件,這也可以提供幫助。 – GETah 2012-03-07 22:30:09

+0

如果你能在機器上可靠地發生這種情況,你唯一的度假村可能會使用windbg。這是一個非常陡峭的學習曲線,但是一旦你掌握了一些基本知識,在調試這樣的事情時非常方便。 – 2012-03-12 14:02:05

回答

0

有些問題值得思考。你有沒有類似的構建機器可以測試 - 這可能有助於確定構建/程序集成或構建的某些可能問題(即Windows問題/病毒/等)。

他安裝到默認文件夾還是他做了一個定製安裝?

他試過完全卸載/重新安裝你的應用程序嗎? (我注意到你說的運行時被刷新) - 可能到一個不同的文件夾來確保。

您可以在安裝VS的類似版本(操作系統版本)上重新創建代碼,以便在調試器中執行代碼演練 - 堆棧跟蹤和輸出緩衝區可以幫助識別 - 所以可能會出現混亂 - 並且可以將其設置爲在所有異常情況下都停止?

不幸的是,未處理的異常不能總是在C#中被捕獲(特別是後2.0) - 所以WinDBG的調試器可能是你唯一的選擇(yuk!)。

我可以建議的東西,雖然第一...只是一個想法:

失敗前行,作爲測試,輸出是這樣的:

var obj = resources.GetObject("HorizontalBox.Image"); 
     Console.WriteLine("Obj = " + (obj is Bitmap)); 

因爲我有一個感覺是,嘗試將資源編組到Bitmap Type並獲取內存異常(可能是因圖像跨度/像素格式等而損壞,或者可能是罪魁禍首上的某些東西使圖像文件看起來像非圖像文件)時發生故障。

+0

感謝您的建議,沃爾夫。不幸的是,我從來沒有*解決過這個問題。我已經到了你提到的最後一招:使用調試器。我實際上沒有這樣做,因爲它在遠程用戶的機器上。 – 2012-04-23 14:43:26