1

VS2005 .Net 2 で開発された大規模なソリューションがあります。TFS2010 から TFS2012 に移行しました (フレームワークは .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.
    

私が見る限り、System.RuntimeTypeHandle.GetTypeByName の引数 1、つまり文字列が 0 であるため、FileNotFound 例外が発生しますが、ファイル名はわかりません。

  1. FusionLog を使用すると、次のことがわかりました。

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.

以下はプロクモンからの抜粋です。

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 によってインストールされます。TFS2010ビルドサーバーにこれがあったため、Silverlightをインストールしようとしましたが、機能しませんでした。

  2. [この記事]: .Net 2.0、VS2010、および Windows 8 での「ファイルまたはアセンブリ System.Drawing またはその依存関係の 1 つを読み込めませんでした」エラーは、System.Drawing エラーは VS のリソース ファイルのバグが原因であると述べています。提案された解決策を試しました:

Edit the top line of the Image stream: AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w TO AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w None of the resource files in my solution has the erroneous top line in the image stream "j00LjAuMC4w"

4.0.0.0 バージョンのすべての .resx ファイルもチェックしましたが、それらはすべて 2.0.0.0 でした

  1. クラッシュ ミニ ダンプは次のとおりです。

ダンプの要約

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

ミニ クラッシュ ダンプで例外コード 0xE0434F4D が返されました。

  • [このアイデア] を試してみました[プログラム名].exe は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"
  • 各プロジェクト ファイルに Set ToolsVersion = 2.0 および TargetFrameworkVersion = v2.0 を追加し、TFSBuild.proj に ToolsVersion="2.0" を追加しようとしました。

  • コマンド ラインから Framework v2 MSBuild を実行しました。

    • どのスイッチ (/m:1 /nr:False "@F:\Builds\59\Platform\myProgram_BugFixing_CI\BuildType\TfsBuild.rsp") も認識されません。
    • これらを削除すると、SolutionRoot が認識されないため、TFSBuild.proj の 7 行目でビルドが失敗します。
    • これをハード コーディングすると、C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\TeamBuild\ Microsoft.TeamFoundation.Build.targets 行 359 でビルドが失敗し、SolutionRoot も参照されます。名前空間に無効な子要素 _SolutionRoot があることを示しています。
    • これは、MSBuild v4 が正しいバージョンであり、TFS2010 ビルド サーバーでも使用する必要があることを示唆しています。

      1. TFS Build.log は、ビルドで使用されるさまざまな ResGen バージョンを明らかにしました。

TFS2012 ビルド サーバー ResGen を TFS2010 ビルド サーバー exe に置き換え、ビルドを正常に実行しましたが、違いはありませんでした。

    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 で 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 を簡単に逆コンパイルすると、次のような非常に単純なプログラムであることがわかります。

  • 引数を解析する
  • .resx ファイルからリソースを読み取ります
  • バイナリ リソース ライターを使用して出力ファイルを書き込みます

実際に変更する必要はないはずなので、2 つのバージョンはかなり似ていると思います (どちらも実際には .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 バージョンを上書きしても効果がなかった理由はこれで説明できます。

4

1 に答える 1

0

TFS2012 ビルド サーバーを次のように変更することで解決しました: Windows Server 2008 R2 x64 => Windows 7 x86

于 2015-06-01T13:03:04.640 に答える