Я хотел бы вернуть эту тему, так как у меня есть та же проблема, и решение bozydar.sz (удаление .NET 4.5) мне не кажется приемлемым. Я нашел ту же проблему с Visual Studio 2012 (Express, Desktop), когда таргетинг на приложение Windows Forms на платформу .NET 3.5.Я проверил DLL ресурсов с ildasm
и обнаружил, что библиотеки ресурсов были созданы с 4.0 runtime, даже целевая структура была 3.5.
Эта же проблема с использованием VS2012 Express указана в Microsoft Dev Center, однако решение не сообщается. В another post на Stackoverflow проблема была также указана для VS2012 и целевой среды < 4.0. Решение для вопросителя состояло в том, чтобы остаться с предыдущей версией Visual Studio, что опять же не является решением.
Я пробовал разные настройки для «Build Action» и других свойств файлов * .resx без успеха.
Далее, я проверил эту проблему следующим образом: Я установил Windows SDK for Windows 7 and .NET 3.5 SP1. Из командной строки этого Windows SDK 7.0 я построил sln-файл Visual Studio 2012 с помощью msbuild 3.5. Проверка ресурсов DLL с ildasm
дает мне версию 2.0.50727 на этот раз, вот что я ожидаю отсюда. Когда я заменяю DLL ресурсов исходного развертывания (из VS2012 публиковать диалог с целевой структурой 3.5 и ToolsVersion 4.0) библиотеками ресурсов, которые я получил из msbuild 3.5 в моем развертывании, проблема решена: Локализация приложения Windows Forms верна Теперь. Но все же использование msbuild 3.5 не является долгосрочным решением. Если целевая структура 3.5 предлагается в VS2012, я бы ожидал, что она будет вести себя правильно.
С Visual Studio 2013 RC наблюдалось то же поведение: библиотеки ресурсов имеют версию 4.0, а не 2.0. Библиотеки ресурсов не могут быть загружены основным приложением.
This answer пользователем Dan Malcom на другой вопрос о Stackoverflow привел меня к хак реестра, который работает для меня:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0]
"MSBuildToolsPath"="c:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\"
"MSBuildToolsRoot"="c:\\Windows\\Microsoft.NET\\Framework64\\"
"FrameworkSDKRoot"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\[email protected])"
"MSBuildRuntimeVersion"="4.0.30319"
"SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A\\[email protected])"
"SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0\\[email protected])"
"MSBuildToolsPath32"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\MSBuild\\ToolsVersions\\[email protected])"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\11.0]
"FrameworkSDKRoot"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\[email protected])"
"SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A\\[email protected])"
"SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0\\[email protected])"
"WindowsSDK80Path"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\[email protected])"
Оригинальные ключи в моем реестре были:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0]
"MSBuildToolsPath"="c:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\"
"MSBuildToolsRoot"="c:\\Windows\\Microsoft.NET\\Framework64\\"
"FrameworkSDKRoot"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\[email protected])"
"MSBuildRuntimeVersion"="4.0.30319"
"SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0A\\[email protected])"
"SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0A\\[email protected])"
"MSBuildToolsPath32"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\MSBuild\\ToolsVersions\\[email protected])"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\11.0]
"FrameworkSDKRoot"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\[email protected])"
"SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A\\[email protected])"
"SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A\\[email protected])"
"WindowsSDK80Path"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\[email protected])"
Я экспортировал реестр ключи, отредактированные в конце, запустили файл для исправления ключей. Для Wow6432Node
реестра я сделал то же самое.
следующие проблемы существовали в моем первоначальном реестре (должно быть состояние после установки VS2012 и Windows SDK 7.0):
- Значение
FrameworkSDKRoot
в ToolsVersions\4.0
ключевых ссылок ключ от Windows SDK 7.0a (тот, который поставляется с VS2010), но эта версия никогда не была установлена на моей машине.
- То же самое относится к значениям
SDK40ToolsPath
и SDK35ToolsPath
.
- Значение
SDK35ToolsPath
в справочнике ToolsVersions\4.0\11.0
WinSDK-NetFx35Tools-x86
, которого не было.
- В
Wow6432Node
все FrameworkSDKRoot
, SDK35ToolsPath
или SDK40ToolsPath
были неверными (ссылка на несуществующие значения реестра).
Редактирование реестра решает проблему, но с высокой стоимостью: необходимо применить это изменение к каждому серверу разработки/сборки.
Когда вы устанавливаете 'CurrentUICulture'? Это должно быть до загрузки ресурсов (то есть прямо в начале программы, прежде чем вы будете отображать какие-либо формы вообще). Это определенно работает для .Net 3.5, мы использовали его для всех наших 3.5 программ Windows Forms. –
Я устанавливаю его в конструкторе основной формы перед методом InitializeComponent, как описано в Пошаговом руководстве. Просто чтобы убедиться, что я изменил его и в начале метода «Program.Main», но он тоже не помог. –