2010-08-08 33 views
1

幾周前開始,編譯一個項目(VB.NET,.NET 2.0,VS 2010)的時間與以前一樣長。在任務管理器中,我注意到ResXtoResources.exe有一段時間需要大量的CPU。我終於能夠使用MSBuild的「診斷」輸出設置獲得一些數據,並將該輸出與我在幾個月前在分支中看到的結果進行比較。最引人注目的是最後一行,它們給出了時間安排。之前:GenerateResource/CoreResGen突然花費近30倍的時間

Target Performance Summary: 
[..] 
    1395 ms CoreResGen         1 calls 
    1930 ms CompileLicxFiles       1 calls 
    2135 ms GenerateApplicationManifest    1 calls 
    2844 ms CoreCompile        1 calls 

Task Performance Summary: 
[..] 
    1391 ms GenerateResource       1 calls 
    1929 ms LC           1 calls 
    2134 ms GenerateApplicationManifest    1 calls 
    2843 ms Vbc          1 calls 

Build succeeded. 

Time Elapsed 00:00:09.50 
========== Rebuild All: 5 succeeded, 0 failed, 0 skipped ========== 

後:

Target Performance Summary: 
    1348 ms CompileLicxFiles       1 calls 
    1747 ms GenerateApplicationManifest    1 calls 
    2595 ms CoreCompile        1 calls 
    39575 ms CoreResGen         1 calls 

Task Performance Summary: 
    1347 ms LC           1 calls 
    1745 ms GenerateApplicationManifest    1 calls 
    2593 ms Vbc          1 calls 
    39570 ms GenerateResource       1 calls 

Build succeeded. 

Time Elapsed 00:00:47.34 
========== Rebuild All: 5 succeeded, 0 failed, 0 skipped ========== 

兩個項目均使用相同的設置在同一系統上編譯。當然,我們已經做了很多改變,但沒有什麼能夠證明這種改變時機的重要性(只有這一項任務!)。我假設資源生成陷入了一些東西 - 循環引用,缺失等等。然而,我一直無法找到任何有用的信息,如何將這種問題追溯到我認爲只是單個資源文件的問題。

通過成千上萬的檢查或暫時從項目中刪除某些表單(以及它們的資源文件),我還有什麼可以解決這個問題嗎?我似乎無法找到單個每個資源文件的時間。

發現迄今:

我已經創建了全部到位相同.resx文件的新的空項目。

  • 該問題在.NET 4.0中無法重現:編譯完全相同的測試項目需要不到一秒的時間。
  • 只要我還添加了原始項目中的一個表單,該問題就可以在.NET 2.0中重現;顯然,它將不會正確地編譯資源。
  • 刪除個人.resx文件將降低計時「按比例」;那就是:我不幸沒有找到一個單獨的文件是罪魁禍首。

回答

1

看起來像this blog entry給出了答案。

在螺母中,搜索.resx文件中實際不存在的裝配參考(例如System.Windows.Forms, Version 4.0.0.0),並將其替換爲(Version 2.0.0.0)。我用grepWin來實現這一點。

我的CoreResGen/GenerateResource時間現在大致是他們以前的樣子。 CruiseControl.NET稱構建時間從92秒縮短到40分鐘。:)

0

我在這裏找到了原因...資源中包含一個保存爲特殊Adobe Fireworks格式(PNG)的PNG文件。我將文件導出到png(沒有圖層信息),現在編譯需要6秒鐘。