2009-07-08 7 views
9

Dans mon application C#, je dois créer un fichier .resx de chaînes personnalisé pour chaque client. Ce que je veux faire est d'éviter de recompiler le projet entier chaque fois que je dois fournir mon application à mon client, donc j'ai besoin d'un accès dynamique à cette chaîne. Alors, comment puis-je accéder (pendant l'exécution de l'application) à un fichier resx si je ne sais pas le nom du fichier uniquement à l'heure d'exécution?Lire une chaîne stockée dans un fichier de ressources (resx) avec un nom de fichier dynamique

Depuis maintenant j'écris quelque chose de similaire:

Properties.Resources.MyString1 

où des ressources est mon fichier Resource.resx. Mais je besoin de quelque chose comme ceci:

GetStringFromDynamicResourceFile("MyFile.resx", "MyString1"); 

Est-il possible?

Merci Mark

+0

Ok Prashanth il wors! La seule chose est que "Func" méthode ne peut pas être "statique" sinon compilateur jeter une exception .. Merci à tous ... –

Répondre

12

Est-ce que quelque chose comme ça vous aidera dans votre cas?

Dictionary<string, string> resourceMap = new Dictionary<string, string>(); 

public static void Func(string fileName) 
{ 
    ResXResourceReader rsxr = new ResXResourceReader(fileName);   
    foreach (DictionaryEntry d in rsxr) 
    { 
     resourceMap.Add(d.Key.ToString(),d.Value.ToString());   
    }   
    rsxr.Close(); 
} 

public string GetResource(string resourceId) 
{ 
    return resourceMap[resourceId]; 
} 
+4

Il est préférable d'envelopper ResXResourceReader dans ** instruction ** en utilisant, au lieu de lecteur de fermeture explicite . – arbiter

+0

très joli code. –

+0

Je pense que je suis tombé sur le code ici (walkthrough 2): http://www.c-sharpcorner.com/UploadFile/yougerthen/105262008135822PM/1.aspx –

1

Bien sûr, il est possible. Vous devez lire environ classe msdn. Et si vous voulez charger les fichiers .resx directement, vous pouvez utiliser ResxResourceSet.

2

Vous pouvez mettre les ressources nécessaires dans une DLL séparée (un pour chaque client), puis extraire les ressources en utilisant la réflexion dynamique:

Assembly ass = Assembly.LoadFromFile("customer1.dll"); 
string s = ass.GetManifestResource("string1"); 

je peux avoir la mauvaise syntaxe - il est tôt. Une mise en garde potentielle ici: accéder à une DLL via Reflection verrouillera le fichier DLL pendant un certain temps, ce qui peut vous empêcher de mettre à jour ou de remplacer la DLL sur la machine du client.

+5

+1 pour ce nom de variable. –

0

Utilisez LINQ to SQL au lieu de référencer la classe System.Windows.Forms.ResXResourceReader dans votre projet.

public string GetStringFromDynamicResourceFile(string resxFileName, string resource) 
{ 
    return XDocument 
       .Load(resxFileName) 
       .Descendants() 
       .FirstOrDefault(_ => _.Attributes().Any(a => a.Value == resource))? 
       .Value; 
} 

et de l'utiliser:

GetStringFromDynamicResourceFile("MyFile.resx", "MyString1"); 
Questions connexes