Запуск проекта 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