如何在单个EXE中嵌入多语言* .resx(或* .resources)文件?

有很多教程如何创建多语言RESX文件以及如何使用AL.exe创建附属程序集,但我还没有找到工作示例如何在单个EXE文件中嵌入RESX / Resources / satellite-DLL文件并分发整个多语言应用程序就像这样的EXE。

我试图使用ilmerge.exe,但它看起来不适用于具有相同名称的多个DLL(文化卫星DLL具有相同的名称,最初驻留在以文化命名的不同子目录中)。

我也不知道如何创建ResourceManager实例来使用嵌入式资源。

我的目标是在封闭的,预定义的语言集之间实现动态切换。 我需要类/方法,它将获得文化字符串(即“de-DE”),资源名称(即“CancelText”)并返回基于嵌入式 resx / resource / dll的翻译文本。

我正在使用VS2008,请注意resx / resource files属性表中需要“构建操作”的设置。 工作代码示例或指向教程项目的链接将是最好的。

我的解决方案:程序只包含一个默认语言资源文件(resx)。 所有其他语言都从.resx编译为.resources并作为资源文件嵌入。 重要! 我已更改扩展名,因为“.resources”被识别为特殊类型的资源,因此我的法语文件名为“PIAE.LangResources.fr”。

以下是检索已翻译字符串的简单代码(应使用资源缓存值进行改进):

internal static string GetString(string str, string lang) { if (string.IsNullOrEmpty(str)) throw new ArgumentNullException("empty language query string"); if (string.IsNullOrEmpty(lang)) throw new ArgumentNullException("no language resource given"); // culture-specific file, ie "LangResources.fr" Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PIAE.LangResources."+lang); // resource not found, revert to default resource if (null == stream) { stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("PIAE.Properties.LangResources.resources"); } ResourceReader reader = new ResourceReader(stream); IDictionaryEnumerator en= reader.GetEnumerator(); while (en.MoveNext()) { if (en.Key.Equals(str)) { return en.Value.ToString(); } } // string not translated, revert to default resource return LangResources.ResourceManager.GetString(str); } 

你找不到它,因为它不是.NET框架的工作方式。 .NET期望在特定命名位置的卫星DLL(以它包含的资源的语言命名的iow目录。例如dede-DEchs ,…)。 如果你不这样做,.NET将无法应用它的魔力(根据当前的UI文化自动选择正确的资源: Thread.CurrentThread.CurrentUICulture )。

使用这个程序,它适合我: EXEPack

你只需要在每次编译时手动完成,不确定是否有命令工具。

我使用了上面的GetString方法。 文章无法使用GetManifestResourceStream()加载清单资源描述如何正确地将资源检索为流对象。 之后,一切正常。