从同一解决方案 C# 的另一个项目访问资源文件

Accessing Resource files from another project of same solution C#

我有一个 Globalization 项目正在解决,还有另一个 MainProject。在 Globalization 下有 2 个资源文件,Resources.resxResources.ar.resx。这两个文件具有相同的密钥。我想根据我在模型 (API).

中获得的语​​言输入输出结果

声明为全局: ResourceManager rm;

然后我有这个功能,它将检查模型的语言输入,并相应地 select 资源文件。

private void CheckResourceManager(string lang)
{                    
    if (lang =="EN")
    {
        rm = new ResourceManager(
            "Globalization.Resources", 
            Assembly.GetExecutingAssembly());
    }
    else
    {
        rm = new ResourceManager(
            "Globalization.Resources.ar", 
            Assembly.GetExecutingAssembly());
    }
}

在 Api 函数中,我首先检查 CheckResourceManager(model.Language); 当需要一条消息时: throw new Exception(rm.GetString("WrongUserName"));

现在的问题是 "Globalization.Resources.ar" 函数中没有读取资源,就像它不能找到文件一样,我应该在这里使用什么。如果我在同一个项目中添加资源文件,那么它将起作用。请指教。谢谢


正确的方法来自下面的答案,但对我来说这个方法工作正常。

声明:

ResourceManager rm;
CultureInfo originalCulture = CultureInfo.CurrentCulture;
Assembly localizeAssembly = Assembly.Load("Globalization");

将函数更改为:

private void CheckResourceManager(string lang)
{
    if (lang =="EN")
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = originalCulture;
        rm = new ResourceManager("Globalization.Resources", localizeAssembly);
    }
    else
    {
        System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("ar");
        rm = new ResourceManager("Globalization.Resources", localizeAssembly);
    }
}

最后,当我需要获得一些价值时:

throw new Exception(rm.GetString("WrongUserName",CultureInfo.CurrentCulture));

谢谢。

ResourceManager 的重点是根据当前线程的 UI 文化切换到不同的文化。您不需要创建单独的函数来执行此操作。它不会明确读取本地化文化 - 它是基于约定的。要控制当前线程的 UI 文化,您需要在 :

中明确设置它
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar")

此外,传递 ExecutingAssembly 意味着您传递的是 顶级 程序集,这很可能不是您的资源所在的程序集。您应该在其中使用一个类型获取 Assembly 实例的程序集:

new ResourceManager(
        "Globalization.Resources", 
        typeof(ClassWithinResourcesAssembly).Assembly)

有关如何使用 ResourceManager 的更多信息,请参阅以下文档: