Метод ResXResourceWriter заменяет весь файл ResX

Я пытаюсь написать метод, который должен добавить ресурс в файл ResX, ресурс добавляется, но другие ресурсы, содержащиеся в файле ResX, теряются, я думаю, что файл заменяется новым с только ресурсом, который Я добавил.

PS: я взял пример из ЗДЕСЬ.

Что я делаю неправильно и какие изменения мне нужно внести в мой метод, чтобы исправить это?

''' <summary>
''' Adds a resource inside a ResX resource table.
''' </summary>
''' <param name="ResXFile">Indicates the ResX file to add the resource.</param>
''' <exception cref="System.Exception"></exception>
Private Sub AddResXResource(ByVal ResXFile As String,
                            ByVal ResourceName As String,
                            ByVal Resource As Object,
                            Optional ByVal Comment As String = Nothing)

    If Not IO.File.Exists(ResXFile) Then
        Throw New Exception(String.Format("Resource file: '{0}' not found.", ResXFile))

    Else

        ' Open the existent ResX file.
        Using ResXWritter As New Resources.ResXResourceWriter(ResXFile)

            ResXWritter.AddResource(New Resources.ResXDataNode(ResourceName, Resource) _
                                        With {.Name = ResourceName, .Comment = Comment})
            ResXWritter.Generate()

        End Using ' ResXWritter As New Resources.ResXResourceWriter(ResXFile)

    End If ' Not IO.File.Exists(ResXFile)

End Sub

Вот как я использую метод:

Dim MyResource As Bitmap = SystemIcons.Information.ToBitmap
AddResXResource(".\Resources.resx", "SysIcon_Info", MyResource, "Resource comment")

person ElektroStudios    schedule 03.05.2014    source источник
comment
Похоже, вы просто используете средство записи ResX вместо имени файла. Я думаю, вам нужно использовать ResXResourceSet, загрузить существующие ресурсы, получить модуль записи из набора, использовать модуль записи для добавления новой записи, создать новый ресурс.   -  person Marvin Smit    schedule 03.05.2014
comment
@Marvin Smit спасибо за комментарий, вы имеете в виду?: 1. получить все существующие ресурсы в файле, 2. снова добавить их все в файл (это должно заменить существующий файл, но я добавляю все извлеченные ресурсы из исходного файла) и, наконец, 3. добавить новый ресурс в этот файл?. Я предположил, что эти классы облегчат эту задачу.   -  person ElektroStudios    schedule 03.05.2014
comment
1: Да, прочитайте их в наборе ресурсов. 2: нет, копировать не нужно. 3: получить писатель из экземпляра набора ресурсов. Затем используйте ваш вышеупомянутый код.   -  person Marvin Smit    schedule 03.05.2014
comment
хм, но конструктор автора не принимает мне набор ресурсов, я думаю, что не понял шаг «3».   -  person ElektroStudios    schedule 03.05.2014
comment
ResourceSet.GetDefaultWriter()   -  person Marvin Smit    schedule 03.05.2014
comment
Это возвращает тип, я не знаю, как продолжить, извините, спасибо за вашу помощь.   -  person ElektroStudios    schedule 03.05.2014


Ответы (1)


Наконец, это то, что я делаю (извлекаю существующие ресурсы, чтобы скопировать их снова в указанный файл вместе с новым ресурсом), но я не считаю это последовательным решением, поэтому I would like to mark as accepted a solution that avoids the copying of the original resources, я действительно полагаю, что один из предоставленных Классы/методы ResX должны выполнять эту задачу.

Код:

' Add ResX Resource
' ( By Elektro )
'
' Usage Examples:
' AddResXResource(".\Resources.resx", "Bitmap Resource", SystemIcons.Information.ToBitmap, "Resource Comment")
'
''' <summary>
''' Adds a resource inside a ResX resource table.
''' </summary>
''' <param name="ResXFile">Indicates the ResX file to add the resource.</param>
''' <exception cref="System.Exception"></exception>
Private Sub AddResXResource(ByVal ResXFile As String,
                            ByVal ResourceName As String,
                            ByVal Resource As Object,
                            Optional ByVal Comment As String = Nothing)

    Dim [Resources] As New Dictionary(Of String, Object)

    If Not IO.File.Exists(ResXFile) Then
        Throw New Exception(String.Format("Resource file: '{0}' not found.", ResXFile))

    Else

        ' Open the existent ResX file.
        Dim ResX = New Resources.ResXResourceSet(ResXFile)

        ' Get the resource enumerator.
        Dim ResXDictionay As IDictionaryEnumerator = ResX.GetEnumerator()

        ' Loop through the existing resources to copy them in the collection.
        Do While ResXDictionay.MoveNext()
            Resources.Add(CStr(ResXDictionay.Key), ResXDictionay.Value)
        Loop ' ResXDictionay.MoveNext()

        ' Add the resource(s) in the ResX file.
        ' Note: This will replace the existent file.
        Using ResXWritter As New Resources.ResXResourceWriter(ResXFile)

            ' Add the retrieved resources into the ResX file.
            If [Resources] IsNot Nothing Then
                For Each ResourceItem In [Resources]
                    ResXWritter.AddResource(ResourceItem.Key, ResourceItem.Value)
                Next ResourceItem
            End If

            ' Add the specified resource into the ResX file.
            ResXWritter.AddResource(New Resources.ResXDataNode(ResourceName, Resource) _
                                        With {.Name = ResourceName, .Comment = Comment})
            ResXWritter.Generate()

        End Using ' ResXWritter As New Resources.ResXResourceWriter(ResXFile)

    End If ' Not IO.File.Exists(ResXFile)

    [Resources] = Nothing

End Sub
person ElektroStudios    schedule 03.05.2014