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 :
    1. Welcome=Bonjour
    2. Goodbye=Au revoir


Mon programme :
  • Namespace : MonAppli
  • Nom de la DLL : MonAppli.exe
  • Fichier de resource embarque avec :
    1. Welcome=Welcome
    2. Goodbye=Goodbye


Le code qui ne fonctionne pas :

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);
J'ai l'exception "MissingManifestResourceException" :
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.
On prend les mêmes mais différemment :
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();
}
(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
    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 !