幾周前開始,編譯一個項目(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
文件將降低計時「按比例」;那就是:我不幸沒有找到一個單獨的文件是罪魁禍首。