无法访问另一个项目中的本地化资源(WPF、C#)

问题描述 投票:0回答:1

首先:我对处理对象和处理方法不太了解。

项目:

目前我正在开发一个解决方案,其中包括 ASP.Net API、WPF 和库项目(全部在 .NET 6.0 中)。该库包含提供本地化字符串的 .resx 文件。我已经根据本指南实现了本地化。除了某些情况外,这种方法效果很好。主要问题出在WPF项目中。我将简化命名空间,使它们更易于访问:

  • WPF 项目:
    My.Namespace.WPF
  • 图书馆项目:
    My.Namespace.Language

为了获取所有支持的语言,我在

My.Namespace.Language
中使用此类:

public class LanguageProvider
{
    public static IEnumerable<CultureInfo> GetSupportedLanguages()
    {
        List<CultureInfo> supportedLanguages = new();
        CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.NeutralCultures);
        foreach (CultureInfo culture in cultures)
        {
            try
            {
                using ResourceSet? rs = Resources.Strings.ResourceManager.GetResourceSet(culture, true, false);
                if (rs is not null && culture.TwoLetterISOLanguageName != "iv")
                {
                    if (!supportedLanguages.Contains(culture))
                    {
                        supportedLanguages.Add(culture);
                    }
                }
                else if (culture.TwoLetterISOLanguageName == "en")
                {
                    supportedLanguages.Add(culture);
                }
            }
            catch (Exception)
            {

            }
        }

        return supportedLanguages;
    }
}

该项目还包含带有

Strings.resx
Strings.de.resx
的资源文件夹(命名空间
My.Namespace.Language.Resources
)。要从我的 WPF 项目中的资源中获取字符串,我只需使用以下命令:

string customText = My.Namespace.Language.Resources.Strings.sometext;

问题:

在第一次调用

GetSupportedLanguages()
之后初始化的所有对象都无法访问
Strings
并抛出
ObjectDisposedException: Cannot access a closed resource set.
通常在初始化
MainWindow
之前调用它。因此我什至无法显示它。由于资源在某个时刻被处置,我是否必须以不同的方式实现可用语言的列表?

c# wpf .net-6.0 dispose resx
1个回答
0
投票

设置参数,让您可以在调用

ResourceSet
时控制是否创建
false
GetResourceSet

using ResourceSet? rs = strings.ResourceManager.GetResourceSet(culture, false, false);

然后,在调用

ResourceManager
方法后,您应该能够像往常一样使用生成的
Resources.Strings
中的
GetSupportedLanguages()
检索资源:

string customText = My.Namespace.Language.Resources.Strings.sometext;
© www.soinside.com 2019 - 2024. All rights reserved.