首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#单汇编语言应用程序-资源未正确加载

C#单汇编语言应用程序-资源未正确加载
EN

Stack Overflow用户
提问于 2013-04-30 15:55:28
回答 1查看 1.1K关注 0票数 1

我正在开发一个简单的C# .NET 4.0应用程序,并希望将其本地化为几种语言。但是,为本地化而创建的附属程序集(即de/MyApp.resources es.dll)将通过拖动这些dll及其文件夹来破坏其简单性。

这就是为什么我寻找一种方法将这些dll包含到主(也是唯一)程序集中,所以只需要将可执行文件发送给最终用户。我偶然发现了这个很有前途的问题,给了它一次机会。

在采用了建议的解决方案中的类之后,我使用预构建命令中的ResourceManager,用SingleAssemblyResourceManager替换了.Designer.cs文件中的所有出现的放屁

代码语言:javascript
复制
fart.exe "$(ProjectDir)*.Designer.cs "System.ComponentModel.ComponentResourceManager" "SingleAssemblyComponentResourceManager"

然后我创建了一个批处理文件,如下所示:

代码语言:javascript
复制
"%ProgramFiles%\ILRepack.exe" /t:exe /out:%1TempProg.exe %1%2.exe %1es\%2.resources.dll 
IF %ERRORLEVEL% NEQ 0 GOTO END

"%ProgramFiles%\ILRepack.exe" /t:exe /out:%1TempProg2.exe %1TempProg.exe %1de\%2.resources.dll
IF %ERRORLEVEL% NEQ 0 GOTO END

"%ProgramFiles%\ILRepack.exe" /t:exe /out:%1SA_%2.exe %1TempProg2.exe %1tr\%2.resources.dll 
IF %ERRORLEVEL% NEQ 0 GOTO END

del %1%2.exe 
del %1%2.pdb 
del %1TempProg.exe
del %1TempProg.pdb
del %1TempProg2.exe 
del %1TempProg2.pdb 
rmdir %1es /S /Q 
rmdir %1de /S /Q 
rmdir %1tr /S /Q 

:END 

并从构建后命令调用它:

代码语言:javascript
复制
$(ProjectDir)postbuild.bat $(TargetDir) $(TargetName)

注意:在本例中,TargetName和ProjectName是相同的。

成功地建造了它,但它并没有像预期的那样工作.表单应该以InstalledUICulture语言显示(如果可用的话)。为此,我在InitializeComponent()之前添加了这一行:

代码语言:javascript
复制
Thread.CurrentThread.CurrentUICulture = CultureInfo.InstalledUICulture;

这在程序的“标准”版本中起了作用。不再是了。不过!我还添加了一个小控件,通过ComboBox在运行时更改语言。守则如下:

代码语言:javascript
复制
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
  if (comboBox1.SelectedItem.ToString() == "English (Default)")
    {
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
      ChangeLanguage("en");
    }
  else if (comboBox1.SelectedItem.ToString() == "Español")
    {
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("es");
      ChangeLanguage("es");
    }
    else if (comboBox1.SelectedItem.ToString() == "Deutsch")
    {
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
      ChangeLanguage("de");
    }
    else if (comboBox1.SelectedItem.ToString() == "Turkce")
    {
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("tr");
      ChangeLanguage("tr");
    }
}

private void ChangeLanguage(string lang)
{
  foreach (Control c in this.Controls)
  {
    SingleAssemblyComponentResourceManager resources = new SingleAssemblyComponentResourceManager(typeof(Form1));
    resources.ApplyResources(c, c.Name, new CultureInfo(lang));
    if (c.ToString().StartsWith("System.Windows.Forms.GroupBox"))
    {
      foreach (Control child in c.Controls)
      {
          SingleAssemblyComponentResourceManager resources_child = new SingleAssemblyComponentResourceManager(typeof(Form1));
          resources_child.ApplyResources(child, child.Name, new CultureInfo(lang));
      }
    }
  }
}

这个确实改变了表单语言。因此dll实际上包含在exe中。那么,为什么InitializeComponent不加载适当的资源呢?我检查了设计人员代码,ResourceManager被SingleAssemblyResourceManager替换了。

另外,除了表单按钮的文本之外,我每种语言都有一个strings.resx文件,用于MessageBoxes和诸如此类的东西,而且这两种方式似乎都行不通。但这可能是另一个问题。

我知道最初的解决方案是为NET2.0环境设计的,而且ResourceSets已经过时了,但我的理解是,即使不推荐它,它也应该工作。

任何关于我应该去哪看的建议都会很棒。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-06 10:11:44

事实证明,我最终能够使它正常工作,稍微修改了CurrentUIculture行。代码似乎没有尝试父母文化(正确),因为如果我将其设置为泛型区域性(即"de“而不是"de-DE"),它将完美地工作。

代码语言:javascript
复制
Thread.CurrentThread.CurrentUICulture = new CultureInfo(CultureInfo.InstalledUICulture.TwoLetterISOLanguageName);

我发现了这一点,因为这是ApplyResources调用与InitializeComponent()和ChangeLanguage()之间唯一明显的区别。

现在,我不知道这是为什么,而且肯定会有一个更好的解决方案,但这是我迄今找到的唯一解决办法。

但是字符串部分仍然不能工作:/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16304088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档