2

这是要求:

使用 Resourcefile 转换器实用程序将项目资源文件从一个版本迁移到另一个版本。(ConvertResx)

我创建了一个简单的 Windows 应用程序项目。在设计时设置本地化属性。在 .resx 文件中,可本地化的属性条目已设置为“元数据”属性。在资源文件转换过程中,它会转换 .resx 文件中的所有条目,但可本地化的属性属性设置为“数据”属性而不是“元数据”属性。

UseResxDataNodes 的类将数据和元数据属性条目放在同一个集合中。

ResXResourceReader reader = new ResXResourceReader(path0);

        reader.UseResXDataNodes = true;

为了检索元数据集合条目,我使用了以下代码

iDictionaryEnumerator7 = reader.GetMetadataEnumerator();

但无法使用“元数据”属性标签读取元数据属性(可本地化)。在资源文件转换后,它已在 resx 文件中设置了“数据”标签。

您能否在这个问题上帮助我,如何读取元数据属性(来自 .resx 文件的设计时属性属性并将引用的程序集迁移到最新版本并将其写入 .resx 文件)如何迁移元数据属性.resx 文件中的条目。

问候, Sivaguru

4

1 回答 1

5

我在尝试将资源文件写出与原始格式相同时遇到了同样的问题。经过一番搜索和试错后,我想出了以下解决方案来正确写出元数据节点。

ResXResourceReader readerData = new ResXResourceReader(new StringReader(sw.ToString()));
ResXResourceReader readerMetaData = new ResXResourceReader(new StringReader(sw.ToString()));

//Flag to read nodes as ResXDataNode, instead of key/value pairs, to preserve Comments.
readerData.UseResXDataNodes = true;

ResXResourceWriter writer = new ResXResourceWriter(this.FilePath);

foreach (DictionaryEntry resEntry in readerData)
{
    ResXDataNode node = resEntry.Value as ResXDataNode;

    if (node != null)
    {
        DictionaryEntry metaDataEntry;

        //Check if node is metadata. The reader does not distinguish between 
        //data and metadata when UseResXDataNodes flags is set to true.
        //http://connect.microsoft.com/VisualStudio/feedback/details/524508/resxresourcereader-does-not-split-data-and-metadata-entries-when-useresxdatanodes-is-true
        if (IsMetaData(readerMetaData, resEntry, out metaDataEntry))
        {
            writer.AddMetadata(metaDataEntry.Key.ToString(), metaDataEntry.Value);
        }
        else
        {
            writer.AddResource(node);
        }
    }   
}

writer.Generate(); //write to the file
writer.Close();

readerData.Close();
readerMetaData.Close();

/// <summary>
/// Check if resource data is metadata. If so, return the metadata node.
/// </summary>
/// <param name="metaDataReader"></param>
/// <param name="resEntry"></param>
/// <param name="metaData"></param>
/// <returns></returns>
private static bool IsMetaData(ResXResourceReader metaDataReader, DictionaryEntry resEntry, out DictionaryEntry metaData)
{
    IDictionaryEnumerator metadataEnumerator = metaDataReader.GetMetadataEnumerator();

    while (metadataEnumerator.MoveNext())
    {
        if (metadataEnumerator.Entry.Key.Equals(resEntry.Key))
        {
            metaData = metadataEnumerator.Entry;
            return true;
        }
    }

    return false;
}
于 2012-07-20T15:05:52.803 回答