Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-无法从ResourceManager(从附属程序集)获取字符串_C#_Resources_Assemblies - Fatal编程技术网

C#-无法从ResourceManager(从附属程序集)获取字符串

C#-无法从ResourceManager(从附属程序集)获取字符串,c#,resources,assemblies,C#,Resources,Assemblies,我正在开发一个可本地化的应用程序。在我的“本地”资源文件中,我已经默认使用了语言(英语),如果可能的话,我加载用户的首选项和区域性,并加载翻译成is语言的字符串 所以我所做的: private static CultureInfo _culture = CultureInfo.CurrentUICulture; private static ResourceManager _manager; private static void ToNeutralCulture() { while

我正在开发一个可本地化的应用程序。在我的“本地”资源文件中,我已经默认使用了语言(英语),如果可能的话,我加载用户的首选项和区域性,并加载翻译成is语言的字符串

所以我所做的:

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;
}
程序集已正确加载,枚举器将向我显示资源文件中存在的所有资源,正常工作,除了:

string mVal = manager.GetString(key);
当我取消注释这一行时,我有一个
System.Resources.MissingManifestResourceException
,有人能告诉我为什么吗

谢谢


[编辑]

“MyApp”项目

项目“MyApp_FR”(Resources.Designer.cs自动生成的文件)

我不明白…

来自Microsoft支持:

如果使用附属程序集中存在的本地化资源,而附属程序集中是使用文件名不正确的.resources文件创建的,则会发生此问题。如果手动创建附属部件,通常会出现此问题:

试试这个知识库:


我找到了原因,希望这能帮助同样情况的人

因此,我在MyApp\u FR.dll中查看了为使用资源文件而生成的代码,它是:

new global::System.Resources.ResourceManager("MyApp_FR.Properties.Resources", typeof(Resources).Assembly);
但在检索清单文件名时,我得到:

“MyApp\u FR.Properties.Resources.Resources”

似乎有一个
.resource
在这个房间里。。。通过删除它,我可以正常使用我的ResourceManager,一切正常

最终代码:

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);

另一种方法,作为测试代码输入以下内容:

string[] resources = 
    System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
在调试过程中,检查资源的内容,以查看它是否与您使用ResourceManager加载的内容匹配

特别要注意的是,如果您得到类似“MyAssembly..Resources.Resources”的内容,则需要显式地将“Resources”添加到ResourceManager构造函数中:

    private static readonly ResourceManager stringTable =
 new ResourceManager("MyAssembly.Resources", Assembly.GetExecutingAssembly());

您确定资源存在于资源程序集中吗?与异常关联的错误消息是什么?下面的问题和答案可能会帮助您:是的,我确定,当我使用枚举器循环时,我会得到我放在卫星资源文件中的所有字符串。@“失望先生”:已经看了,不起作用。@Arnaud:Dang,这一个如何(我收集到它最终归结为名称空间问题):不是手动创建的文件。我在VS2k8中创建了一个新项目,进入“属性”->“资源”->“添加”并将我的所有翻译放在这里。我反编译了处理此问题的.NET代码,它在加载之前会任意添加
.Resources
。甚至由VS生成的附属程序集也会失败。因此,我认为.NET处理附属程序集的方式还有改进的余地。谢谢你的侦探工作。
string[] resources = 
    System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
    private static readonly ResourceManager stringTable =
 new ResourceManager("MyAssembly.Resources", Assembly.GetExecutingAssembly());