我想把这个话题带回来,因为我有同样的问题,而且bozydar.sz(卸载 .NET 4.5)的解决方案对我来说似乎不可接受。在将我的 Windows Forms 应用程序定位到 .NET 3.5 框架时,我发现 Visual Studio 2012(Express,Desktop)存在同样的问题。我检查了资源 DLL,ildasm
发现资源 DLL 是用 4.0 运行时构建的,即使目标框架是 3.5。
Microsoft Dev Center报告了使用 VS2012 Express 的相同问题,但未报告解决方案。在Stackoverflow 上的另一篇文章中,也报告了 VS2012 和目标框架 < 4.0 的问题。提问者的解决方案是继续使用以前版本的 Visual Studio,这又不是一个很好的解决方案。
我为“构建操作”和 *.resx 文件的其他属性尝试了不同的设置,但没有成功。
接下来,我验证了这个问题如下:我安装了Windows SDK for Windows 7 和 .NET 3.5 SP1。在该 Windows SDK 7.0 的命令提示符下,我使用 msbuild 3.5 构建了 Visual Studio 2012 sln 文件。这次检查资源 DLLildasm
给了我 2.0.50727 版本,这就是我在这里所期望的。当我用我在部署中从 msbuild 3.5 获得的资源 DLL 替换原始部署的资源 DLL(来自具有目标框架 3.5 和 ToolsVersion 4.0 的 VS2012 发布对话框)时,问题得到了解决:Windows 窗体应用程序的本地化是正确的现在。但是,使用 msbuild 3.5 仍然不是一个长期的解决方案。如果在 VS2012 中提供目标框架 3.5,我希望它能够正常运行。
在 Visual Studio 2013 RC 中观察到相同的行为:资源 DLL 的版本为 4.0 而不是 2.0。主应用程序无法加载资源 DLL。
用户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\\v8.0A@InstallationFolder)"
"MSBuildRuntimeVersion"="4.0.30319"
"SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A\\WinSDK-NetFx40Tools-x86@InstallationFolder)"
"SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0\\WinSDKNetFx35Tools@InstallationFolder)"
"MSBuildToolsPath32"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\MSBuild\\ToolsVersions\\4.0@MSBuildToolsPath)"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\11.0]
"FrameworkSDKRoot"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A@InstallationFolder)"
"SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A\\WinSDK-NetFx40Tools-x86@InstallationFolder)"
"SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0\\WinSDKNetFx35Tools@InstallationFolder)"
"WindowsSDK80Path"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0@InstallationFolder)"
我的注册表中的原始键是:
[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\\v7.0A@InstallationFolder)"
"MSBuildRuntimeVersion"="4.0.30319"
"SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0A\\WinSDK-NetFx40Tools-x86@InstallationFolder)"
"SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0A\\WinSDK-NetFx35Tools-x86@InstallationFolder)"
"MSBuildToolsPath32"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\MSBuild\\ToolsVersions\\4.0@MSBuildToolsPath)"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\11.0]
"FrameworkSDKRoot"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A@InstallationFolder)"
"SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A\\WinSDK-NetFx40Tools-x86@InstallationFolder)"
"SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0A\\WinSDK-NetFx35Tools-x86@InstallationFolder)"
"WindowsSDK80Path"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v8.0@InstallationFolder)"
我导出了注册表项,对其进行了编辑,最后运行了文件以更正密钥。对于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
不存在的 a。
- 在 中,
Wow6432Node
所有或不正确(引用不存在的注册表值)。FrameworkSDKRoot
SDK35ToolsPath
SDK40ToolsPath
编辑注册表可以解决问题,但代价高昂:需要将此更改应用于每台开发计算机/构建服务器。