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