2

要件は次のとおりです。

Resourcefileコンバータユーティリティを使用して、プロジェクトリソースファイルをあるバージョンから別のバージョンに移行します。(ConvertResx)

簡単なWindowsアプリケーションプロジェクトを作成しました。設計時にローカリゼーションプロパティを設定します。.resxファイルでは、ローカライズ可能なプロパティエントリが「MetaData」属性で設定されています。リソースファイルの変換中に、.resxファイル内のすべてのエントリが変換されますが、ローカライズ可能なプロパティ属性は、「メタデータ」属性ではなく「データ」属性で設定されます。

UseResxDataNodesのクラスは、データとメタデータの両方の属性エントリを同じコレクションに配置しました。

ResXResourceReaderリーダー=新しいResXResourceReader(path0);

        reader.UseResXDataNodes = true;

メタデータコレクションのエントリを取得するために、私は以下のコードを使用しました

iDictionaryEnumerator7 = reader.GetMetadataEnumerator();

ただし、「Metadata」属性タグを使用してメタデータプロパティ(ローカライズ可能)を読み取ることができません。リソースファイルの変換後、resxファイルに「Data」タグが設定されています。

この問題について、メタデータ属性を読み取る方法(.resxファイルから設計時のプロパティ属性を取得し、参照されるアセンブリを最新バージョンに移行して.resxファイルに書き込む方法)メタデータ属性を移行する方法を教えてください。 .resxファイルのエントリ。

よろしく、Sivaguru s

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 に答える