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

0

同じ問題があり、 bozydar.sz (.NET 4.5 のアンインストール) の解決策が受け入れられないように思われるため、このトピックを元に戻したいと思います。Windows フォーム アプリケーションのターゲットを .NET 3.5 フレームワークにすると、Visual Studio 2012 (Express、Desktop) で同じ問題が発生しました。リソース DLL を調べたildasmところ、ターゲット フレームワークが 3.5 であっても、リソース DLL が 4.0 ランタイムでビルドされていることがわかりました。

VS2012 Express を使用した場合と同じ問題が Microsoft Dev Centerで報告されていますが、解決策は報告されていません。Stackoverflowの別の投稿では、VS2012 およびターゲット フレームワーク < 4.0 についても問題が報告されています。質問者の解決策は、以前のバージョンの Visual Studio をそのまま使用することでしたが、これもあまり解決策ではありません。

「Build Action」および *.resx ファイルのその他のプロパティに対してさまざまな設定を試みましたが、成功しませんでした。

次に、この問題を次のように検証しました。Windows SDK for Windows 7 と .NET 3.5 SP1をインストールしました。その Windows SDK 7.0 のコマンド プロンプトから、msbuild 3.5 を使用して Visual Studio 2012 sln ファイルをビルドしました。リソース DLL を調べたildasmところ、今回はバージョン 2.0.50727 でした。元の展開のリソース DLL (ターゲット フレームワーク 3.5 および ToolsVersion 4.0 を使用した VS2012 パブリッシュ ダイアログから) を、展開で msbuild 3.5 から取得したリソース DLL に置き換えると、問題は解決されます: Windows フォーム アプリケーションのローカリゼーションは正しい今。それでも、msbuild 3.5 の使用は長期的な解決策ではありません。VS2012 でターゲット フレームワーク 3.5 が提供されている場合は、これが適切に動作することを期待します。

Visual Studio 2013 RC でも同じ動作が観察されました。リソース DLL のバージョンは 2.0 ではなく 4.0 です。リソース DLL は、メイン アプリケーションによってロードできません。

Stackoverflow に関する別の質問に対するユーザーのDan Malcomによるこの回答は、私にとって有効なレジストリ ハックにつながりました。

[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.0Windows SDK 7.0A (VS2010 に付属するもの) のキーを参照していますが、このバージョンは私のマシンにはインストールされていません。
  • SDK40ToolsPathとの値についても同じことが言えSDK35ToolsPathます。
  • キーの SDK35ToolsPath値は、存在しなかった を参照しています。ToolsVersions\4.0\11.0WinSDK-NetFx35Tools-x86
  • の、またはWow6432Nodeのすべてが正しくありませんでした (存在しないレジストリ値を参照しています)。FrameworkSDKRootSDK35ToolsPathSDK40ToolsPath

レジストリを編集すると問題は解決しますが、コストが高くなります。この変更をすべての開発用コンピューター/ビルド サーバーに適用する必要があります。

于 2013-10-09T09:44:52.857 に答える
-1

この問題は、Visual C# Express または .NET 4.5 のインストールが原因であることがわかりました (どちらが問題の原因かはわかりません)。

リソース サテライト DLL を ILSpy で確認したところ、.NET 3.5 でプロジェクトをビルドしていた場合でも、リソース DLL が 4.0 ランタイムでビルドされ、アプリケーションで読み込めないことがわかりました。これが、私が変更した後もテキストが変更されなかった理由CurrentUICultureです。

.NET 4.5 をアンインストールし、Visual C# 2010 Express を再インストールすると、問題が解決しました。リソースを含むサテライト DLL が 2.0 ランタイムでビルドされ、アプリケーションによって正しくロードされるようになりました。

于 2013-05-14T13:43:07.067 に答える