Création d'un ResourceManager à partir d'une assembly satellite
Salut,
ce que je souhaite faire m'a l'air simple et pourtant.
Le contexte?
:fleche: Une appli multilangue embarquant les libellés générique de base (anglais)
:fleche: 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 :
Code:
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" :
Citation:
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:
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:
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?
:merci: beaucoup !