FileNotFoundException для System.Drawing V4 при миграции с TFS2010 на TFS2012. Код исключения 0xE0434F4D

У меня есть большое решение, разработанное в 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.

Я перенес Framework на.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.
    

Насколько я вижу, аргумент 1 System.RuntimeTypeHandle.GetTypeByName, то есть строка 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.

Вот выдержка из 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. [Эта статья]: "Не удалось загрузить файл или сборку System.Drawing или одну из ее зависимостей" в.Net 2.0, VS2010 и Windows 8 говорит, что ошибка System.Drawing вызвана ошибкой файла ресурсов в VS. Я попробовал предлагаемое решение:

Редактировать верхнюю линию потока изображения: AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w не AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w Ни один из файлов ресурсов в моем решении имеет ошибочный верхнюю строку в поток изображения "j00LjAuMC4w"

Также проверил все файлы.resx для версии 4.0.0.0, но все они были 2.0.0.0

  1. Вот Crash Mini Dump:

Резюме дампа

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.

  • Попробовал [эту идею] [имя программы].exe перестал работать, запустив myProgram от имени администратора, но без помощи.
  • [Этот блог] http://blog.toxa.de/archives/38 (также имеет дело с.Net 2) дал мне идею убрать значок с SplashScreen. Что влияет на возникшую ошибку. Вместо получения ошибки 1, как описано выше, вы получаете 3 ошибки с опцией продолжения.

    1. Из журнала сборки:

Я видел MSBuild из Framework v4 использовался

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 в каждый из файлов проекта и ToolsVersion="2.0" в TFSBuild.proj.

  • Запустил Framework v2 MSBuild из командной строки:

    • Ни один из переключателей (/m:1 /nr:False "@F:\Builds\59\Platform\myProgram_BugFixing_CI\BuildType\TfsBuild.rsp") не распознается.
    • После их удаления сборка завершается неудачно в строке 7 файла TFSBuild.proj, поскольку SolutionRoot не распознается.
    • Если я жестко закодирую это, сборка завершится неудачно на 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 и успешно выполнил сборку, что не имело значения.

    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. Использование IlSpy в myProgram.exe (обе версии) для декомпиляции кода показывает две древовидные структуры, в которых декомпилированные файлы.cs идентичны, но двоичные файлы.resource различаются (как по размеру, так и по содержимому).

В частности, двоичное редактирование показывает, что в хвосте 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
  • Использует средство записи двоичных ресурсов для записи выходного файла

Я подозреваю, что две версии довольно похожи, так как не должно быть реальной необходимости менять (обе они фактически помечены как.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 - это объясняет, почему перезапись версии ResGen.exe, использованной в пункте 7 выше, не дала эффекта.

1 ответ

Решение

Решено путем изменения сервера сборки TFS2012 с: Windows Server 2008 R2 x64 => Windows 7 x86

Другие вопросы по тегам