2010-08-08 31 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秒钟。