几个卫星程序集中嵌入的资源

3
我知道有关卫星程序集的问题已经有很多了,但是在实现它们时我仍然遇到了一些问题。
我的目标是将每种语言文化分别放入一个程序集中,这样我就可以灵活地在需要时只重新编译一个程序集,而不必编译所有语言,即使我只想对一个语言进行一些微小的更改也是如此。
我希望完全理解卫星程序集的工作原理。这是我目前的理解:
- 卫星程序集可以在不需要重新编译整个应用程序的情况下放入 bin 目录中,这意味着只要指定回退资源,应用程序就不需要这些程序集才能正常工作。 - S.A. 必须链接到单个文化。
现在我可以使用 al 工具生成 S.A., 或者如果我添加了 .resx 文件,Visual Studio 可以为我创建 S.A. (在 bin 文件夹中可以看到指定文化的文件夹结构)。
问题 1:这些 dll 是否等效?由 Visual Studio 生成和由 al 工具生成的 dll 是否相同?
问题 2:所有这些 dll 是否必须共享一个公共名称才能工作?(我知道为了一致性,它们应该共享名称,但如果它们不共享名称,比如使用 al 工具指定不同的名称创建它们,它们仍然可以被 .Net 框架识别并加载吗?)
问题 3:如果我想使用 ResourceManager 类,是否必须为每个程序集文化实例化一个实例?(由于它们在名称中包含文化,它们具有不同的程序集名称,我是否必须手动格式化嵌入式资源文件以匹配当前文化并手动加载该程序集?由于它们可能不会在第一次加载时加载,所以我是否必须通过指定“文化文件夹”内的文件路径来手动加载它们?)
问题 4:这些 S.A. 是否由 .Net 框架自动加载,还是我必须明确加载它们?
问题 5:如果我必须加载它们,这意味着如果我想在我的控件标记中声明资源,我必须创建并注册一个自定义资源工厂才能加载它们吗?
问题 6:如果我在 Visual Studio 的类项目中添加了几种语言的多个资源且没有代码,它们会自动嵌入,当我编译时,将为每种文化创建卫星程序集,这些 dll 是否相关?我想知道它们是否由名称、命名空间或其他东西相关。
所有这些问题都基于以下内容:我原以为只需将程序集添加到bin文件夹中,并在ResourceManager中指定类似于全局程序集的东西,即使资源位于不同的程序集中(这就是我对程序集名称或多个卫星程序集之间关系的担忧),它也会自动加载资源,就像在单个程序集中定义资源时一样,只需调用Resources.MyResourceKey即可。
感谢您的帮助,这个主题让我发疯了 =(
1个回答

3
我知道resgenal工具看起来比它们应该的要复杂一些,但我相信您的目标是可以实现的,即您可以在Visual Studio解决方案之外构建卫星程序集(以节省您在解决方案中维护所有翻译资源的时间),但获得完全相同的结果。 问题1:是的。 问题2:是的,ResourceManager依赖命名约定来加载本地化资源。 问题3:不是。您可以使用标准的ResourceManager。实际上,您根本不必直接使用ResourceManager。将基本资源包含在您的解决方案中,并将其配置为Build Action = Embedded Resource和Custom Tool = PublicResXFileCodeGenerator,然后Visual Studio将自动生成并维护一个类(与您的resx文件同名),使您可以通过静态属性访问资源。根据Thread.CurrentThread.CurrentUICulture和部署的卫星程序集,这些属性将提供来自卫星程序集或基本程序集的本地化资源。 问题4:不是。ResourceManager会自动执行此操作。 问题5:请参见Q4。没有什么可做的。 问题6:请参见Q2。它基于命名约定(按文化命名的文件夹,卫星程序集按基础dll命名)和元数据(例如使用al编译时使用的文化名称)。

关于您对第三个问题的回答:您所说的“将基本资源包含在解决方案中并进行配置”,是什么意思?我猜测这些资源已经在dll中,每种语言一个dll。我将这些dll(带有语言名称文件夹)放在另一个项目中以便使用它们,但是资源管理器总是返回英文,似乎没有查看/识别其他语言的dll。 - Li Tian Gong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接