Запуск проекта VS2010 с TargetFramework 2.0 и файлами resx вызывает FileNotFound 'System.Windows.Forms v4.0'

У меня проблема с запуском приложения из MS Visual Studio 2010. На самом деле это долгая история, и раньше я сталкивался с разными связанными проблемами. Но как минимум полгода проект проработал без изменений. И вот снова пытаюсь запустить, но безрезультатно. Сначала несколько ссылок о связанных проблемах, которые могут показаться одинаковыми (но похоже, что это не то же самое - только связанные):

Файл (или сборка) не может быть найденным после изменения целевой платформы .NET проекта с 4.0 на 3.5

Понизить версию приложения с .net 4.0 до 3.5

Проблемы с файлами RESX в VS2010, ориентированном на платформу 3.5

В моем проекте TargetFramework = 2.0, и он содержит несколько файлов ресурсов resx с изображениями и значками для приложения. Раньше у меня были проблемы с компиляцией файлов ресурсов, но я их исправил, как в сообщениях по ссылкам выше. И все работало нормально до вчерашнего дня (я давно не открывал этот проект, поэтому не могу сказать, что именно изменилось в среде).

А теперь сама проблема: сборка проекта завершается успешно, но при запуске приложения я получаю исключение FileNotFoundException в ресурсах кода конструктора форм. GetObject ("myImageName") ':

Could not load file or assembly 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.
at System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName)
at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
at System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark)
at System.Type.GetType(String typeName, Boolean throwOnError)
at System.Resources.ResourceReader.FindType(Int32 typeIndex)
at System.Resources.ResourceReader.DeserializeObject(Int32 typeIndex)
at System.Resources.ResourceReader.LoadObjectV2(Int32 pos, ResourceTypeCode& typeCode)
at System.Resources.ResourceReader.LoadObject(Int32 pos, ResourceTypeCode& typeCode)
at System.Resources.RuntimeResourceSet.GetObject(String key, Boolean ignoreCase, Boolean isString)
at System.Resources.RuntimeResourceSet.GetObject(String key, Boolean ignoreCase)
at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture, Boolean wrapUnmanagedMemStream)
at System.Resources.ResourceManager.GetObject(String name)
[MYAPP stack trace part. Hope you don't need it]
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

Я задал вопрос о эту проблему на сайте Microsoft и нашел еще одного человека, у которого точно такая же проблема. Но его вопрос был проигнорирован, и на мой тоже пока нет ответа.

Среда: Windows 7 x64, .NET 4.0 SP1, VS 2010 Ultimate SP1. Конфигурация сборки проекта: Debug / AnyCPU (пробовал Debug / Release для AnyCPU / x86 - все равно. X64 и IA64 - для этого проекта невозможны)

Подробности расследования:

  • Файлы resx не содержат ссылок на сборки 4.0. Особенно это относится к System.Windows.Forms 2.0 и System.Drawing 2.0.
  • в проекте нет (и не может быть ссылок на какую-либо сборку 4.0, потому что он имеет TargetFramwork 2.0)
  • Поиск во всей папке проекта записей "4.0" обнаружил странный факт: мой exe-файл имеет ссылку на mscorlib 4.0. На самом деле я не могу понять, как это могло случиться и как это исправить. Хотя AppDomain.CurrentDomain.GetAssemblies () возвращает mscorlib 2.0, а не 4.0 (и все другие сборки .NET версии 2.0).
  • переключение resgen в 32-битный режим не помогает. Возвращать его тоже бесполезно.
  • изменение файла proj с помощью блокнота для использования "правильной" версии resgen тоже не помогает
  • целый день расследования и многие другие попытки оказались безуспешными. Я даже не нашел много людей, у которых была такая же проблема.
  • То же самое и для TargetFramework = 3.5, но при установке TargetFramework = 4.0 все начинает работать нормально. К сожалению, в настоящее время перейти на .NET 4.0 невозможно.

person Sasha    schedule 29.05.2012    source источник
comment
RESX-файл содержит ресурсы, закодированные в base64. Это мешает вам увидеть, что один из них имеет ссылку на встроенную сборку 4.0. Вам нужно будет вернуться к .NET 4, удалить ресурсы, переключиться на 3.5 и добавить их обратно.   -  person Hans Passant    schedule 30.05.2012
comment
Я ничего не менял в файле resx, так как он работал нормально. Итак, как туда добавить тупую ссылку на Winforms 4.0? У НАС есть система контроля версий в этом проекте, и в ней говорится, что файл не был изменен. Я читал на каком-то форуме, чтобы проверить файл resx на строку j00 в первой строке двоичных данных и заменить ее на j0y. Я полагаю, что это та версия DLL, на которую вы указали. Но, как и ожидалось, он равен j0y.   -  person Sasha    schedule 30.05.2012
comment
Еще один момент: после 2 дней исследования эта проблема стала глобальной и теперь воспроизводится во всех проектах с TargetFramework ‹4 и с большим количеством ресурсов (странно, но не для всех ресурсов), так что изменить все это вручную практически невозможно. Надеюсь, должен быть другой путь   -  person Sasha    schedule 30.05.2012
comment
Я попробовал вашу рекомендацию, но даже чтение ресурса вручную с использованием TargetFramework = 2.0 в данной ситуации не помогает = (. Тое же исключение.   -  person Sasha    schedule 30.05.2012