从TFS2010迁移到TFS2012时System.Drawing V4的FileNotFoundException。例外代码0xE0434F4D

时间:2015-04-22 14:29:43

标签: tfs2012 tfsbuild filenotfoundexception system.drawing resgen

我有一个在VS2005 .Net 2中开发的大型解决方案。我们从TFS2010迁移到TFS2012(将Framework保持为.Net v2)。所有在IDE,构建和安装中都可以正常工作,但是当执行程序时,请获取以下问题签名:

Problem Event Name: CLR20r3
Problem Signature 01: myProgram.exe
Problem Signature 02: 1.0.0.5
Problem Signature 03: 550f8264
Problem Signature 04: mscorlib
Problem Signature 05: 2.0.0.0
Problem Signature 06: 53a12268
Problem Signature 07: f15
Problem Signature 08: 3
Problem Signature 09: System.IO.FileNotFoundException
OS Version:      6.1.7601.2.1.0.256.48
Locale ID:           2057

TFS2010构建服务器是Windows XP SP3 x86。

TFS2012构建服务器是Windows Server 2008 R2 x64。

我已将框架迁移到.Net 4并且一切正常,但遗憾的是有些客户要求.Net 2。

  1. 使用WinDbg给了我以下内容:

    Problem Signature 04 gives us where the error originated, mscorlib.
    Problem Signature 07 gives us the methodDef, which we can use to get the methodDesc “702b8c10” => “System.RuntimeTypeHandle.GetTypeByName(String.String, Boolean, Boolean, Boolean, System.Threading.StackCrawlMark ByRef)”
    Problem Signature 08 gives us the Offset so when I do a dump of the IL, I get “ldarg.0” at offset 3.
    
  2. 据我所知,System.RuntimeTypeHandle.GetTypeByName的参数1即字符串为0,因此FileNotFound异常,但它并没有告诉我文件名。

    1. 使用FusionLog给了我以下内容:
    2. 它成功加载System.Drawing v2,但后来也尝试加载失败的v4(我已经检查过没有项目引用任何.Net v4程序集。)

      ** Assembly Binder Log Entry  (30/03/2015 @ 14:45:05) ***
      
      The operation failed.
      Bind result: hr = 0x80070002. The system cannot find the file specified.
      
      Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
      Running under executable  C:\Program Files\Common Files\myProgram\myProgram.exe
      --- A detailed error log follows. 
      
      === Pre-bind state information ===
      LOG: User = HOST1\Administrator
      LOG: DisplayName = System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
       (Fully-specified)
      LOG: Appbase = file:///C:/Program Files/Common Files/myProgram/
      LOG: Initial PrivatePath = NULL
      LOG: Dynamic Base = NULL
      LOG: Cache Base = NULL
      LOG: AppName = myProgram.exe
      Calling assembly : (Unknown).
      ===
      LOG: This bind starts in default load context.
      LOG: No application configuration file found.
      LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
      LOG: Post-policy reference: System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
      LOG: GAC Lookup was unsuccessful.
      LOG: Attempting download of new URL file:///C:/Program Files/Common Files/myProgram/System.Drawing.DLL.
      LOG: Attempting download of new URL file:///C:/Program Files/Common Files/myProgram/System.Drawing/System.Drawing.DLL.
      LOG: Attempting download of new URL file:///C:/Program Files/Common Files/myProgram/System.Drawing.EXE.
      LOG: Attempting download of new URL file:///C:/Program Files/Common Files/myProgram/System.Drawing/System.Drawing.EXE.
      LOG: All probing URLs attempted and failed.
      

      以下是Procmon的摘录:

      CreateFile  C:\Windows\assembly\GAC_32\myProgram.resources\1.0.0.5_en_0a4a2ad97614f98d  PATH NOT FOUND
      CreateFile  C:\Windows\assembly\GAC_MSIL\myProgram.resources\1.0.0.5_en_0a4a2ad97614f98d    PATH NOT FOUND
      CreateFile  C:\Windows\assembly\GAC\myProgram.resources\1.0.0.5_en_0a4a2ad97614f98d PATH NOT FOUND
      CreateFile  C:\Program Files\Common Files\myProgram\en\myProgram.resources.dll  PATH NOT FOUND
      CreateFile  C:\Program Files\Common Files\myProgram\en\myProgram.resources\myProgram.resources.dll  PATH NOT FOUND
      CreateFile  C:\Program Files\Common Files\myProgram\en\myProgram.resources.exe  PATH NOT FOUND
      CreateFile  C:\Program Files\Common Files\myProgram\en\myProgram.resources\myProgram.resources.exe  PATH NOT FOUND
      CreateFile  C:\Windows\assembly\GAC_32\System.Drawing\4.0.0.0__b03f5f7f11d50a3a PATH NOT FOUND
      CreateFile  C:\Windows\assembly\GAC_MSIL\System.Drawing\4.0.0.0__b03f5f7f11d50a3a   NAME NOT FOUND
      CreateFile  C:\Windows\assembly\GAC\System.Drawing\4.0.0.0__b03f5f7f11d50a3a    PATH NOT FOUND
      CreateFile  C:\Program Files\Common Files\myProgram\System.Drawing.dll  NAME NOT FOUND
      CreateFile  C:\Program Files\Common Files\myProgram\System.Drawing\System.Drawing.dll   PATH NOT FOUND
      CreateFile  C:\Program Files\Common Files\myProgram\System.Drawing.exe  NAME NOT FOUND
      CreateFile  C:\Program Files\Common Files\myProgram\System.Drawing\System.Drawing.exe   PATH NOT FOUND
      

      正如您所看到它尝试加载myProgram.resources.dll并失败,然后尝试加载Framework v4文件,这让我查看资源文件。

      1. mscorlib.resources.dll由.Net和Silverlight的语言包安装。尝试安装Silverlight作为我们的TFS2010构建服务器有这个,但没有工作。

      2. [本文]:"Could not load file or assembly System.Drawing or one of its dependencies" error on .Net 2.0, VS2010 and Windows 8表示System.Drawing错误是由VS中的资源文件错误引起的。 我尝试过建议的解决方案:

      3. 编辑图像流的顶行:AAEAAAD ///// AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w到AAEAAAD ///// AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w 我的解决方案中没有任何资源文件在图像流中有错误的顶行" j00LjAuMC4w"

        还检查了4.0.0.0版本的所有.resx文件,但它们都是2.0.0.0

        1. 这里是Crash Mini Dump:
        2. 转储摘要

          Dump File:  WER6229.tmp.mdmp :     C:\Users\Administrator\AppData\Local\Temp\WER6229.tmp.mdmp
          Last Write Time:    16/04/2015 10:46:17
          Process Name:   myProgram.exe : C:\Program Files (x86)\Common Files\myProgram\myProgram.exe
          Process Architecture:   x86
          Exception Code: 0xE0434F4D
          Exception Information:  An exception came from the CLR
          Heap Information:   Not Present
          
          System Information
          ------------------
          OS Version: 6.1.7601
          CLR Version(s): 2.0.50727.5485
          
          Modules
          -------
          Module Name Module Path Module Version
          ----------- ----------- --------------
          myProgram.exe   C:\Program Files (x86)\Common Files\myProgram\myProgram.exe 1.4.2015.12
          ntdll.dll   C:\Windows\SysWOW64\ntdll.dll   6.1.7601.18247
          mscoree.dll C:\Windows\System32\mscoree.dll 4.0.40305.0
          kernel32.dll    C:\Windows\SysWOW64\kernel32.dll    6.1.7601.18409
          KERNELBASE.dll  C:\Windows\SysWOW64\KERNELBASE.dll  6.1.7601.18409
          advapi32.dll    C:\Windows\SysWOW64\advapi32.dll    6.1.7601.18247
          msvcrt.dll  C:\Windows\SysWOW64\msvcrt.dll  7.0.7601.17744
          sechost.dll C:\Windows\SysWOW64\sechost.dll 6.1.7600.16385
          rpcrt4.dll  C:\Windows\SysWOW64\rpcrt4.dll  6.1.7601.18532
          sspicli.dll C:\Windows\SysWOW64\sspicli.dll 6.1.7601.18719
          CRYPTBASE.dll   C:\Windows\SysWOW64\CRYPTBASE.dll   6.1.7600.16385
          mscoreei.dll    C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoreei.dll  4.0.30319.18408
          shlwapi.dll C:\Windows\SysWOW64\shlwapi.dll 6.1.7601.17514
          gdi32.dll   C:\Windows\SysWOW64\gdi32.dll   6.1.7601.18577
          user32.dll  C:\Windows\SysWOW64\user32.dll  6.1.7601.17514
          lpk.dll C:\Windows\SysWOW64\lpk.dll 6.1.7601.18177
          usp10.dll   C:\Windows\SysWOW64\usp10.dll   1.626.7601.18454
          imm32.dll   C:\Windows\System32\imm32.dll   6.1.7601.17514
          msctf.dll   C:\Windows\SysWOW64\msctf.dll   6.1.7600.16385
          mscorwks.dll    C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll  2.0.50727.5485
          msvcr80.dll C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6229_none_d089f796442de10e\msvcr80.dll  8.0.50727.6229
          shell32.dll C:\Windows\SysWOW64\shell32.dll 6.1.7601.18429
          ole32.dll   C:\Windows\SysWOW64\ole32.dll   6.1.7601.17514
          profapi.dll C:\Windows\SysWOW64\profapi.dll 6.1.7600.16385
          mscorlib.ni.dll C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\38bf604432e1a30c954b2ee40d6a2d1c\mscorlib.ni.dll    2.0.50727.5485
          mscorsec.dll    C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorsec.dll  2.0.50727.5483
          wintrust.dll    C:\Windows\SysWOW64\wintrust.dll    6.1.7601.18205
          crypt32.dll C:\Windows\SysWOW64\crypt32.dll 6.1.7601.18277
          msasn1.dll  C:\Windows\SysWOW64\msasn1.dll  6.1.7601.17514
          comctl32.dll    C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.7601.18201_none_ec80f00e8593ece5\comctl32.dll 5.82.7601.18201
          cryptsp.dll C:\Windows\System32\cryptsp.dll 6.1.7600.16385
          rsaenh.dll  C:\Windows\System32\rsaenh.dll  6.1.7600.16385
          imagehlp.dll    C:\Windows\SysWOW64\imagehlp.dll    6.1.7601.18288
          ncrypt.dll  C:\Windows\System32\ncrypt.dll  6.1.7601.18714
          bcrypt.dll  C:\Windows\System32\bcrypt.dll  6.1.7600.16385
          bcryptprimitives.dll    C:\Windows\SysWOW64\bcryptprimitives.dll    6.1.7600.16385
          userenv.dll C:\Windows\SysWOW64\userenv.dll 6.1.7601.17514
          gpapi.dll   C:\Windows\System32\gpapi.dll   6.1.7601.18711
          cryptnet.dll    C:\Windows\System32\cryptnet.dll    6.1.7601.18205
          Wldap32.dll C:\Windows\SysWOW64\Wldap32.dll 6.1.7601.17514
          SensApi.dll C:\Windows\System32\SensApi.dll 6.1.7600.16385
          uxtheme.dll C:\Windows\System32\uxtheme.dll 6.1.7600.16385
          mscorjit.dll    C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll  2.0.50727.5467
          myProgram.Engine.dll    C:\Windows\assembly\GAC_MSIL\myProgram.Engine\1.0.0.5__0a4a2ad97614f98d\myProgram.Engine.dll    1.4.2015.12
          System.ni.dll   C:\Windows\assembly\NativeImages_v2.0.50727_32\System\908ba9e296e92b4e14bdc2437edac603\System.ni.dll    2.0.50727.5485
          System.Drawing.ni.dll   C:\Windows\assembly\NativeImages_v2.0.50727_32\System.Drawing\836e10dfd0811b303553216f5cb092ef\System.Drawing.ni.dll    2.0.50727.5483
          System.Windows.Forms.ni.dll C:\Windows\assembly\NativeImages_v2.0.50727_32\System.Windows.Forms\1453d9e9a4989833ef3db4b22549ba1a\System.Windows.Forms.ni.dll    2.0.50727.5483
          myProgram.Designer.dll  C:\Windows\assembly\GAC_MSIL\myProgram.Designer\1.0.0.5__0a4a2ad97614f98d\myProgram.Designer.dll    1.4.2015.12
          myProgram.UI.dll    C:\Windows\assembly\GAC_MSIL\myProgram.UI\1.0.0.5__0a4a2ad97614f98d\myProgram.UI.dll    1.4.2015.12
          DevComponents.DotNetBar.dll C:\Windows\assembly\GAC\DevComponents.DotNetBar\5.8.0.0__7eb7c3a35b91de04\DevComponents.DotNetBar.dll   5.8.0.0
          version.dll C:\Windows\System32\version.dll 6.1.7600.16385
          apphelp.dll C:\Windows\System32\apphelp.dll 6.1.7601.17514
          

          Mini Crash Dump给了我异常代码0xE0434F4D。

          • 尝试[此想法] [program name].exe has stopped working以管理员身份运行myProgram但没有帮助。
          • [此博客] http://blog.toxa.de/archives/38(也处理.Net 2)让我想到从SplashScreen中删除图标。这会影响引发的错误。如上所述,您没有获得1错误,而是使用continue选项获得3个错误。

            1. 来自构建日志:

          我看到使用了Framework v4中的MSBuild

          C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo /noconsolelogger "F:\Builds\59\Platform\myProject_BugFixing_CI\BuildType\TFSBuild.proj" /m:1 /nr:False "@F:\Builds\59\Platform\myProject_BugFixing_CI\BuildType\TfsBuild.rsp"
          
          • 尝试在每个项目文件和ToolsVersion =" 2.0"中添加Set ToolsVersion = 2.0和TargetFrameworkVersion = v2.0。在TFSBuild.proj。

          • 从命令行运行Ran Framework v2 MSBuild:

            • 无法识别任何开关(/ m:1 / nr:False" @F:\ Builds \ 59 \ Platform \ myProgram_BugFixing_CI \ BuildType \ TfsBuild.rsp")。
            • 删除这些后,在TFSBuild.proj的第7行上构建失败,因为无法识别SolutionRoot。
            • 如果我对此进行硬编码,则在C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ TeamBuild \ Microsoft.TeamFoundation.Build.targets第359行的构建失败也会引用SolutionRoot。它说命名空间中有一个无效的子元素_SolutionRoot。
            • 这表明MSBuild v4是正确的版本,并且TFS2010构建服务器也必须使用它。

              1. TFS Build.log显示了在构建中使用的不同ResGen版本:

          我用TFS2010构建服务器exe替换了TFS2012构建服务器ResGen并成功运行了一个构建,没有任何区别。

              TFS2010 – Path of ResGen used: C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\ResGen.exe
              This is v3.5.30729.4507 and dated 19/03/2010
          
              TFS2012 – Path of ResGen used: C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\bin\Resgen.exe
              This is v2.0.50727.42 and dated 23/09/2005
          

          [这篇文章] MSBuild cant find resgen.exe建议设置

          HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\CurrentVersion
          

          中的设置ProductionVersion相同的值
          HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A
          

          它是v8,但这没有用。

          1. 在myProgram.exe(两个版本)上使用IlSpy反编译代码显示两个树结构,其中反编译的.cs文件相同但二进制.resource文件不同(大小和内容)。
          2. 特别是二进制编辑显示,在mainform.resources的尾部是行(当然还有其他差异):

            System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d
            

            在旧的TFS2010 exe中,vs

            System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
            

            在新的TFS2012 exe中。 这意味着新版本使用.Net 4二进制序列化;旧的正在使用.Net 2二进制序列化。

            ResGen的快速反编译显示它是一个非常简单的程序:

            • Parses args
            • 从.resx文件中读取资源
            • 使用二进制资源编写器编写输出文件

            我怀疑这两个版本非常相似,因为不应该真正需要更改(两者都标记为.net2 / AnyCPU)。

            更有趣的是,使用的二进制序列化程序来自mscorlib,因此新构建必须使用.Net 4 mscorlib (但构建日志说它是v2

            C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
            FusionName = mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
            

            )尽管ResGen实际上是.Net 2二进制文件 - 这可以解释为什么覆盖上面第7点中尝试的ResGen.exe版本没有效果。

1 个答案:

答案 0 :(得分:0)

通过更改TFS2012构建服务器解决: Windows Server 2008 R2 x64 => Windows 7 x86