C# - 无法获得从ResourceManager的字符串(来自于卫星组装) [英] C# - Cannot getting a string from ResourceManager (from satellite assembly)

查看:161
本文介绍了C# - 无法获得从ResourceManager的字符串(来自于卫星组装)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个应用程序localisable。在我的本地资源文件,我已经在默认情况下(英文)所使用的语言,如果可能的话,我加载用户的喜好和文化,负载字符串翻译成的语言。

I'm developing a localisable application. In my "local" resource file, I've the language used by default (english) and if possible, I load the user's preference and culture and load strings translated in is language.

所以我做了什么:

private static CultureInfo _culture = CultureInfo.CurrentUICulture;
private static ResourceManager _manager;

private static void ToNeutralCulture()
{
    while (!_culture.IsNeutralCulture)
    {
        _culture = _culture.Parent;
    }
}

private static void LoadCulture()
{
    ResourceManager manager = Properties.Resources.ResourceManager;

    try
    {
        ToNeutralCulture();

        string assembly = Assembly.GetCallingAssembly().GetName().CodeBase;
        string assemblyDir = Path.GetDirectoryName(assembly);
        string assemblyName = Path.GetFileNameWithoutExtension(assembly);
        string resourceFileName = string.Format(CultureInfo.InvariantCulture,
            @"{0}\{1}_{2}.dll",
            assemblyDir,
            assemblyName,
            _culture.Name.ToUpper());

        FileInfo resourceFile = new FileInfo(resourceFileName);
        if (resourceFile.Exists)
        {
            Assembly resourceAssembly = Assembly.LoadFrom(resourceFile.FullName);
            string[] manifests = resourceAssembly.GetManifestResourceNames();

            if (manifests.Length == 1)
            {
                manager = new ResourceManager(manifests[0], resourceAssembly);
            }

            using (ResourceReader reader = new ResourceReader(resourceAssembly.GetManifestResourceStream(manifests[0])))
            {
                IDictionaryEnumerator dict = reader.GetEnumerator();
                while (dict.MoveNext())
                {
                    string key = dict.Key as string;
                    object val = dict.Value;

                    //string mVal = manager.GetString(key);
                }
            }
        }
    }
    catch (Exception ex)
    {
        Trace.WriteLine(ex.Message);

        Trace.WriteLine(string.Format(CultureInfo.InvariantCulture,
            "Fail to loading culture {0}", 
            (_culture == null) ? "--" : _culture.EnglishName));
    }

    _manager = manager;
}



大会正确地装入普查员会显示我目前在资源的所有资源文件,那么,正常工作情况除外:

Assembly is correctly loaded and the enumerator will display me all resources present in the resource file, well, works fine except :

string mVal = manager.GetString(key);

当我注释掉这一行,我有一个 System.Resources.MissingManifestResourceException ,有人可以告诉我为什么?

When I uncommented this line, I've an System.Resources.MissingManifestResourceException, can someone tell me why?

谢谢!

项目MyApp的

namespace MyApp
{
    Assembly resourceAssembly = Assembly.LoadFrom(resourceFileName);
    string[] manifests = resourceAssembly.GetManifestResourceNames();

    if (manifests.Length == 1)
    {
        manager = new ResourceManager(manifests[0], resourceAssembly);
    }

    // Throws the exception
    manager.GetString("PleaseCallIT", null);

    // Works
    using (ResourceReader reader = new ResourceReader(resourceAssembly.GetManifestResourceStream(manifests[0])))
    {
        IDictionaryEnumerator dict = reader.GetEnumerator();
        while (dict.MoveNext())
        {
            string key = dict.key as string; // PleaseCallIT
            object val = dict.value; // Please call IT.
        }
    }
}

项目MyApp_FR(资源了.Designer.cs自动生成的文件)

Project "MyApp_FR" (Resources.Designer.cs auto-generated file)

namespace MyApp.Properties {
    // ...
    internal static string PleaseCallIT {
        get {
            return ResourceManager.GetString("PleaseCallIT", resourceCulture);
        }
    }
}



我不明白。 ..

I don't understand...

推荐答案

我找到原因,希望这将帮助别人也就是在同一案件中。

I found why, hope this will help someone that is in the same case.

所以,我看着在 MyApp_FR.dll 生成使用资源文件中的代码,它是:

So, I looked in MyApp_FR.dll the code generated to use the Resource file, it is :

new global::System.Resources.ResourceManager("MyApp_FR.Properties.Resources", typeof(Resources).Assembly);



但检索清单文件名时,我得到了:

but when retrieving the manifest file names, I got :

MyApp_FR.Properties.Resources.resources

"MyApp_FR.Properties.Resources.resources"

似乎是有一个 .resource 来多在这个房间里......通过消除它,我可以正常使用了我的ResourceManager,一切工作正常...

Seems to be there is a .resource to much in this room... By removing it, I can use my ResourceManager normally, all works fine...

最终代码:

Assembly resourceAssembly = Assembly.LoadFrom(resourceFileName);
string[] manifests = resourceAssembly.GetManifestResourceNames();
if (manifests.Length == 1)
{
    string manifest = manifests[0].Replace(".resources", string.Empty);
    manager = new ResourceManager(manifest, resourceAssembly);
}

// Works !
manager.GetString("PleaseCallIT", null);

这篇关于C# - 无法获得从ResourceManager的字符串(来自于卫星组装)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆