1

我在使用目标 .NET 3.5 框架制作可本地化的 WinForms 应用程序时遇到问题。

我正在遵循 MSDN 的指南:http: //msdn.microsoft.com/en-us/library/y99d1cd3%28v=vs.90%29.aspx

在我遵循演练并创建可本地化的表单并设置Thread.CurrentThread.CurrentUICulture为某种文化之后,它仅在我将目标框架设置为“.NET Framework 4”时才有效。在使用“.NET Framework 3.5”作为目标框架重新编译应用程序后,我无法显示与默认不同的语言,因此设置CurrentUICulture不会影响显示的文本。

我找不到有关此问题的任何信息,以及 .NET 3.5 和 .NET 4.0 中存在不同行为的任何信息。有没有人有类似的问题,或者知道我描述的行为原因是什么?

更多解释:

  1. 我在方法CurrentUICulture之前设置InitializeComponents

    public partial class Form1 : Form 
    {
        public Form1()
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("pl-PL");
            InitializeComponent();
        }
    }
    
  2. 一切都在 .NET 4.0 中完美运行,但是当我将其更改为 .NET 3.5 时却不是。 在此处输入图像描述

  3. 我正在使用 Visual C# 2010 Express。

4

4 回答 4

3

我知道我参加聚会已经很晚了,但是由于我花了几个小时来找到解决方案,所以我想与您分享。该解决方案适用于 Visual Studio 2017。

我猜这个问题与以下讨论的问题有关:https ://developercommunity.visualstudio.com/content/problem/5735/when-vs-2017-rc-is-installed-resourcesdll-is-gener.html

问题是 VS 2017 使用 .NET 4.0 编译资源卫星程序集 dll,这导致它们被编译为 .NET 2.0 可执行文件的 exe 静默忽略。

解决方法是启动Visual Studio Installer,点击Visual Studio Commuity 2017下面的Modify。将选项卡更改为单个组件并选择并安装.NET Framework 3.5 开发工具

于 2018-03-12T19:37:03.217 回答
0

我想把这个话题带回来,因为我有同样的问题,而且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后的状态):

  • 键中的FrameworkSDKRootToolsVersions\4.0引用了 Windows SDK 7.0A(VS2010 附带的那个)中的一个键,但这个版本从未安装在我的机器上。
  • SDK40ToolsPathSDK35ToolsPath值也是如此。
  • 键中的 SDK35ToolsPathToolsVersions\4.0\11.0引用了WinSDK-NetFx35Tools-x86不存在的 a。
  • 在 中,Wow6432Node所有或不正确(引用不存在的注册表值)。FrameworkSDKRootSDK35ToolsPathSDK40ToolsPath

编辑注册表可以解决问题,但代价高昂:需要将此更改应用于每台开发计算机/构建服务器。

于 2013-10-09T09:44:52.857 回答
0

设置文化如下

public MainForm()
{
    // Set default culture before initialisation.
    SetCurrentCulture();
    InitializeComponent();
}

如下所示SetCurrentCulture并设置默认文化。这需要在InitializeComponent调用之前执行。

public static void SetCurrentCulture(CultureInfo cultureInfo)
{
    Thread.CurrentThread.CurrentCulture = cultureInfo;
    Thread.CurrentThread.CurrentUICulture = cultureInfo;
    CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
    CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
}

CultureInfo.DefaultThreadCurrentCultureand是在 .NET4.5+ 中引入的CultureInfo.DefaultThreadCurrentUICulture,用于告诉从主 UI 线程分离的任何后续线程,默认区域性应该是指定的值。这可能与您使用 .NET4.0 无关。

我希望这有帮助。

于 2013-05-14T09:10:36.513 回答
-1

我发现问题是由我安装的 Visual C# Express 或 .NET 4.5 引起的(不确定哪一个是问题的根源)。

在我使用 ILSpy 检查了我的资源附属 DLL 之后,似乎即使我使用 .NET 3.5 构建我的项目,资源 DLL 也是使用 4.0 运行时构建的,并且无法由应用程序加载。这就是为什么 text 没有改变的原因,即使在我改变之后CurrentUICulture

卸载 .NET 4.5 并重新安装 Visual C# 2010 Express 解决了这个问题。现在,带有资源的卫星 DLL 是使用 2.0 运行时构建的,并且可以由我的应用程序正确加载。

于 2013-05-14T13:43:07.067 回答