我正在为我的项目进行本地化.为此,我有一个类应该从另一个程序集加载一个嵌入的资源,然后读出字符串.
但是我还需要知道这个程序集包含哪些资源文件.这些数字和语言是未知的.
那么如何找出这个程序集中的".resx"文件是如何命名的呢?这些都有相同的方案:"de-DE.resx","en-US.resx",依此类推.
我需要知道这个程序集中包含了多少这些文件,以及它们是哪种语言.
我知道ResourceManager可以访问它们,因此也应该可以以编程方式访问这些信息......
在我的函数 GetAssemblyResourceStream(下面的代码)中,我使用“assembly.GetManifestResourceStream”和“resourceReader.GetResourceData”从 Dll 读取资源。
当我从资源的字节数组设置内存流时,我必须包含 4 个字节的偏移量:
const int OFFSET = 4;
resStream = new MemoryStream(data, OFFSET, data.Length - OFFSET);
Run Code Online (Sandbox Code Playgroud)
那个偏移的原因是什么?它来自哪里?
参考:MSDN ResourceReader 类末尾的示例
另外:我制作了一个测试应用程序来更好地理解资源。该应用程序显示了我在偏移量方面的问题。我的小测试应用程序可在Github (VS 2015)
更新 2015-10-05 10h28由于答案非常低,我怀疑存在错误和/或未记录的行为。我在Connect.Microsoft.com 上报告了一个错误,并将看到结果。
2015-10-07 更新我删除了错误。我仍然认为它没有得到很好的记录和/或可以被视为一个错误,但我非常怀疑他们会在不做任何事情的情况下关闭我的请求。我希望没有人会遇到和我一样的问题。
代码:
// ******************************************************************
/// <summary>
/// The path separator is '/'. The path should not start with '/'.
/// </summary>
/// <param name="asm"></param>
/// <param name="path"></param>
/// <returns></returns>
public static Stream GetAssemblyResourceStream(Assembly asm, string path)
{
// Just to be …Run Code Online (Sandbox Code Playgroud) 我想只使用其uri从任何程序集(同一个应用程序)加载任何资源.两个程序集都是同一应用程序的一部分.
因为我希望能够从任何程序集加载,所以我不能使用未在通用Dll中定义的"App"或"Application".
我认为部分或答案正在使用: System.Reflection.Assembly.GetCallingAssembly().GetManifestResourceStream(path);
但我找不到如何从uri中正确查找/提取/解析程序集?
笔记:
到目前为止(约3小时后),使用反射器后,似乎使用静态System.Windows.Application.GetResourceStream(uri).Stream具有资源缓存等优点.这很糟糕,因为它被挂钩到WPF(System.windows).我正在寻找一种更好的方法(不依赖于任何特定的UI框架)来完成这项工作.