Salut,
ce que je souhaite faire m'a l'air simple et pourtant.
Le contexte?
Une appli multilangue embarquant les libellés générique de base (anglais)
Une DLL supplémentaire par langue gérée (embarquant donc les traductions nécessaires).
Ma DLL de langue (qui ne contient qu'un fichier de ressource) :
- Namespace : MonAppli
- Nom de la DLL : MonAppli_FR.dll
- Fichier de resource embarque avec :
- Welcome=Bonjour
- Goodbye=Au revoir
Mon programme :
- Namespace : MonAppli
- Nom de la DLL : MonAppli.exe
- Fichier de resource embarque avec :
- Welcome=Welcome
- Goodbye=Goodbye
Le code qui ne fonctionne pas :
J'ai l'exception "MissingManifestResourceException" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Assembly a = Assembly.LoadFrom(@"%PATH%\MonAppli_FR.dll"); string[] manifests = a.GetManifestResourceNames(); ResourceManager RM = new ResourceManager(manifests[0], a); string welcome = RM.GetString("Welcome", null); string goodbye = RM.GetString("Goodbye", null);
On prend les mêmes mais différemment :Impossible de trouver des ressources appropriées pour la culture spécifiée ou la culture neutre. Assurez-vous que "MonAppli.Properties.Resources.resources.resources" a été correctement incorporé ou lié dans l'assembly "MonAppli_FR" au moment de la compilation ou que tous les assemblys satellites requis sont chargeables et complètement signés.
(Avec la petite extension pour ResourceReader qui va bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Assembly a = Assembly.LoadFrom(@"%PATH%\MonAppli_FR.dll"); string[] manifests = a.GetManifestResourceNames(); using (ResourceReader reader = new ResourceReader(a.GetManifestResourceStream(manifests[0]))) { // Bienvenue string welcome = (from pair in reader.AsEnumerable() where pair.Key == "Welcome" select pair.Value).First(); // Au revoir string goodbye = (from pair in reader.AsEnumerable() where pair.Key == "Goodbye" select pair.Value).First(); }
)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public static class RRExtension { public static IEnumerable<KeyValuePair<string, string>> AsEnumerable(this ResourceReader reader) { IDictionaryEnumerator e = reader.GetEnumerator(); while (e.MoveNext()) { yield return new KeyValuePair<string, string>((string)e.Key, (string)e.Value); } } }
Quelqu'un peut m'expliquer ce que je fais mal, pourquoi la première méthode ne fonctionne pas alors que la seconde si?
beaucoup !
Partager