2013-05-14 86 views
1

我有一個問題,使目標.NET 3.5框架本地化的WinForms應用程序。我下面的演練和創建本地化的形式和設置Thread.CurrentThread.CurrentUICulture一些文化,當我設置爲目標框架是」 .NET Framework 4的它只是工作後 http://msdn.microsoft.com/en-us/library/y99d1cd3%28v=vs.90%29.aspx使用.NET 3.5本地化Windows窗體

我下面從MSDN指南」。在將「.NET Framework 3.5」作爲目標框架重新編譯應用程序後,我無法顯示與默認不同的語言,因此設置CurrentUICulture不會影響顯示的文本。

我找不到任何關於此問題的信息,任何有關.NET 3.5和.NET 4.0中不同行爲的信息。有沒有人有類似的問題,或者知道我描述的行爲的原因是什麼?

更多的解釋:

  1. 我以前InitializeComponents方法設置CurrentUICulture

    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
         Thread.CurrentThread.CurrentUICulture = new CultureInfo("pl-PL"); 
         InitializeComponent(); 
        } 
    } 
    
  2. 一切都在.NET 4.0中完美的工作,但是當我將其更改爲.NET 3.5是不。 enter image description here

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

+1

你什麼時候設置'CurrentUICulture'?它必須在資源加載之前(即,在顯示任何表單之前,在程序開始時)。它絕對適用於.Net 3.5,我們將它用於我們所有的3.5 Windows窗體程序。 – 2013-05-14 08:33:12

+0

我按照演練中所述的'InitializeComponent'方法在主窗體構造函數中設置它。只是爲了確保我在'Program.Main'方法開始時也改變了它,但它也沒有幫助 – 2013-05-14 08:37:41

回答

-1

我發現問題是由於我安裝了Visual C#Express或.NET 4.5(不知道哪一個是問題的根源)而導致的。

當我用ILSpy檢查了我的資源附帶DLL後,它似乎即使在我使用.NET 3.5構建項目時,資源DLL也是使用4.0運行時構建的,無法由應用程序加載。這就是文字沒有改變的原因,即使我改變了CurrentUICulture

卸載.NET 4.5並重新安裝Visual C#2010 Express解決了此問題。現在,具有資源的衛星DLL與2.0運行時一起構建,並由我的應用程序正確加載。

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.DefaultThreadCurrentCultureCultureInfo.DefaultThreadCurrentUICulture是在.NET4.5 +引入並用於告訴從主UI線程派生的任何後續線程有默認培養應在規定值。這可能不適合你使用.NET4.0。

我希望這會有所幫助。

+0

謝謝你的回答,但在我的情況下它不會幫助。我將文化設置在正確的位置,它可以與.NET 4.0協同工作,但在將目標框架更改爲.NET 3.5之後會立即停止。我編輯了我的帖子以提供更多見解。 – 2013-05-14 09:39:45

0

我想回到這個話題,因爲我有同樣的問題和bozydar.sz(卸載.NET 4.5)的解決方案似乎不被我接受。當我將Windows Forms應用程序定位到.NET 3.5框架時,我發現了與Visual Studio 2012(Express,Desktop)相同的問題。我用ildasm檢查了資源DLL,發現資源DLL是用4.0運行時構建的,即使目標框架是3.5。

使用VS2012 Express的相同問題已在Microsoft Dev Center上報告,但未報告解決方案。在Stackoverflow的another post上,VS2012和目標框架< 4.0也報告了此問題。提問者的解決方案是與Visual Studio的以前版本保持一致,這再次不是一個很好的解決方案。

我嘗試了「Build Action」和* .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(從VS2012發佈對話框到目標框架3.5和ToolsVersion 4.0)時,問題就解決了:Windows Forms應用程序的本地化是正確的現在。但是,使用msbuild 3.5並不是一個長期的解決方案。如果在VS2012中提供了目標框架3.5,我預計這會表現得很好。

在Visual Studio 2013 RC中,觀察到相同的行爲:資源DLL具有版本4.0而不是2.0。主應用程序無法加載資源DLL。

This answer用戶Dan Malcom到#2另一個問題導致我一個註冊表破解這對我的作品:

[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後):

  • ToolsVersions\4.0鍵引用從Windows SDK 7.0A關鍵的FrameworkSDKRoot值(一個來自VS2010),但這個版本從未安裝在我的機器上。
  • 這同樣適用於SDK40ToolsPathSDK35ToolsPath值。
  • ToolsVersions\4.0\11.0鍵中的SDK35ToolsPath值引用了一個不存在的WinSDK-NetFx35Tools-x86
  • Wow6432Node中,所有FrameworkSDKRoot,SDK35ToolsPathSDK40ToolsPath都不正確(引用不存在的註冊表值)。

編輯註冊表可解決問題,但代價高昂:需要將此更改應用於每臺開發計算機/構建服務器。