2014-05-03 2 views
-1

J'essaie d'écrire une méthode qui devrait ajouter une ressource à un fichier ResX, la ressource est ajoutée mais les autres ressources contenues dans le fichier ResX sont perdues, je pense que le fichier est remplacé par un nouveau avec seulement la ressource que j'ai ajouté. PS: J'ai pris l'exemple de HERELa méthode ResXResourceWriter remplace l'ensemble du fichier ResX

PS: J'ai pris l'exemple de HERE.

Ce que je fais mal et quels changements dois-je faire dans ma méthode pour résoudre ce problème?

''' <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 

Voici comment j'utilise la méthode:

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

comme vous Semblent juste à l'aide d'un écrivain ResX sur un nom de fichier. Je pense que vous devez utiliser le ResXResourceSet, charger les ressources existantes, obtenir un écrivain de l'ensemble, utiliser l'écrivain pour ajouter votre nouvelle entrée, générer la nouvelle ressource. –

+0

@Marvin Smit merci pour le commentaire, voulez-vous dire ?: 1. récupérer toutes les ressources existantes dans le fichier, 2. tous les ajouter dans le fichier (cela devrait remplacer le fichier existant, mais j'ajoute tous les récupérés ressources du fichier original) et enfin 3. ajouter la nouvelle ressource dans ce fichier ?. J'ai supposé que ces classes faciliteraient cette tâche. – ElektroStudios

+0

1: Oui, lisez-les dans un ensemble de ressources. 2: non, pas besoin de copier. 3: obtenir un écrivain de l'instance resourceset. Ensuite, utilisez votre code indiqué. –

Répondre

0

Enfin ce que je fais (récupérer les ressources existantes pour les copier à nouveau dans le fichier spécifié en même temps que le nouveau ressource), mais je ne considère pas cela comme une solution cohérente, donc je suppose que l'une des classes/méthodes ResX fournies devrait faire cette tâche.

Le code:

' 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 
Questions connexes