我想把这个话题带回来,因为我有同样的问题,bozydar.sz(卸载 .NET 4.5)的解决方案对我来说似乎不可接受。在将我的 Windows Forms 应用程序定位到 .NET 3.5 框架时,我发现 Visual Studio 2012(Express,Desktop)存在同样的问题。我使用ildasm 检查了资源 DLL,发现资源 DLL 是使用 4.0 运行时构建的,即使目标框架是 3.5。
MicrosoftDev Center 报告了使用 VS2012 Express 的相同问题,但未报告解决方案。在 Stackoverflow 上的 another post 中,也报告了 VS2012 和目标框架
我为“构建操作”和 *.resx 文件的其他属性尝试了不同的设置,但没有成功。
接下来,我验证了这个问题如下:我安装了Windows SDK for Windows 7 and .NET 3.5 SP1。在该 Windows SDK 7.0 的命令提示符下,我使用 msbuild 3.5 构建了 Visual Studio 2012 sln 文件。这次用ildasm 检查资源DLL 给了我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。
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\\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后的状态):
-
ToolsVersions\4.0 键中的FrameworkSDKRoot 值引用了 Windows SDK 7.0A(VS2010 附带的)中的一个键,但我的机器上从未安装过这个版本。
-
SDK40ToolsPath 和 SDK35ToolsPath 值也是如此。
-
ToolsVersions\4.0\11.0 键中的 SDK35ToolsPath 值引用了一个不存在的 WinSDK-NetFx35Tools-x86。
- 在
Wow6432Node 中,所有FrameworkSDKRoot、SDK35ToolsPath 或SDK40ToolsPath 都不正确(引用不存在的注册表值)。
编辑注册表可以解决问题,但代价高昂:需要将此更改应用于每台开发计算机/构建服务器。