160 votes

C #: que signifie MissingManifestResourceException et comment y remédier?

La situation:

  • J'ai une bibliothèque de classe, appelés RT.Servers, contenant un peu de ressources (de type byte[], mais je ne pense pas que c'est important)
  • De la même bibliothèque de classe contient une méthode qui retourne un de ces ressources
  • J'ai un programme simple (avec une référence à la bibliothèque) que seuls les appels de méthode unique

Je reçois MissingManifestResourceException avec le message suivant:

Impossible de trouver toutes les ressources approprié pour la culture spécifiée ou la culture neutre. Assurez-vous que "Les serveurs.Les ressources.ressources" a été correctement lié ou incorporé dans assemblée "RT.Les serveurs" au moment de la compilation, ou que tous les assemblys satellites requis sont chargeables et entièrement signé.

Je n'ai jamais joué avec les cultures, ou avec la signature de l'assembly, donc je ne sais pas ce qui se passe ici. Aussi, cela fonctionne dans un autre projet qui utilise la même bibliothèque. Des idées?

251voto

Timwi Points 30896

Tout ce que je devais faire pour résoudre ce problème est de cliquer droit sur l' Resources.resx le fichier dans l'Explorateur de solutions, puis cliquez sur Exécuter l'Outil Personnalisé. Cette re-création de l'auto-générés Resources.Designer.cs le fichier.

Si l' .fichier resx a été ajouté au projet manuellement, l'Outil Personnalisé de la propriété du fichier doit être mis à "ResXFileCodeGenerator".

Le problème est dû à une incompatibilité des espaces de noms, ce qui se produit si vous modifiez l' "espace de noms par défaut" de l'assemblée dans les paramètres du projet. (J'ai changé depuis (déjà) "Servers" (maintenant) "RT.Servers".)

Dans le code généré automatiquement en Resources.Designer.cs, il y a le code suivant:

internal static global::System.Resources.ResourceManager ResourceManager {
    get {
        if (object.ReferenceEquals(resourceMan, null)) {
            global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Servers.Resources", typeof(Resources).Assembly);
            resourceMan = temp;
        }
        return resourceMan;
    }
}

La chaîne littérale "Servers.Resources" devait être modifié en "RT.Servers.Resources". Je l'ai fait manuellement, mais l'exécution de l'outil personnalisé aurait tout aussi bien fait.

38voto

Mark Rushakoff Points 97350

Je viens de tomber sur ce problème aujourd'hui, et j'ai trouvé cette Aide et de Support Microsoft page qui fait contourner le problème.

J'ai eu un couple de délégués en haut de mon fichier, en l'espace de noms global, et tout d'un coup, j'ai été d'obtenir un MissingManifestResourceException lors de l'exécution du programme, sur cette ligne:

this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

Puis j'ai déménagé les délégués dans l'espace de noms, a obtenu le même message d'erreur. Enfin j'ai mis les délégués dans la seule classe dans ce fichier, et l'erreur est allé loin, mais je ne voulais pas les délégués de la classe ou de l'espace de noms.

Puis je suis tombé sur ce lien ci-dessus, qui dit

Pour résoudre ce problème, déplacez tous les autres définitions de classe de sorte qu'elles apparaissent après la forme de la définition de la classe.

J'ai mis les délégués (dont je ne serait pas en compte "les définitions de classe") au bas de ce fichier, à l'extérieur de l'espace de noms local, et le programme n'a pas reçu l' MissingManifestResourceException plus. Ce qu'est un irritant erreur. Mais, cela semble être une solution plus robuste que de modifier le code généré automatiquement :)

35voto

Motti Points 32921

J'ai couru dans un problème similaire, et même si je sais que ce n'est pas la cause de l'OP avais-je vais le poster ici afin que si quelqu'un d'autre s'étend à travers ce problème à l'avenir une réponse sera disponible.

Si vous ajoutez une classe avant la classe de concepteur, vous obtiendrez un MissingManifestResourceException d'exception au moment de la compilation (pas d'erreur de compilation ou d'avertissement) parce que

Visual Studio exige que les concepteurs utilisent la première classe le le fichier.

Pour (un peu) plus d'information, voir ce post.

17voto

BlaM Points 10753

J'ai eu le même problème, mais à l'aide de l' Outil Personnalisé Exécuter une commande en tant que suggéré par Timwi n'aide pas dans mon cas.

Cependant, il me conduire dans la bonne direction, parce que j'ai fini dans les Propriétés de l' .resx fichier. Ici, j'ai remarqué une différence à l'autre .resx fichier qui a causé aucun problème.

Dans mon cas, j'ai dû changer la propriété "Action de génération" à partir de "Ressource" pour "Ressource Incorporée".

Ma meilleure supposition pour la raison en est, que j'ai eu l' .resx dans une bibliothèque qui a été utilisé par une autre application. Ma demande n'a pas son propre .resx fichier, de sorte qu'il a dû utiliser l'une à partir de la bibliothèque, qui est seulement disponible quand il est incorporé dans la bibliothèque et non pas "stand alone".

13voto

Quand je le lance dans un sujet similaire, dans Vs 2012, il s'est avéré que la "un Outil Personnalisé de l'espace de Noms" propriété du fichier resx était fausse (dans mon cas, en fait, elle a été supprimée, de sorte que le code généré production de cette exception à l'exécution). Ma dernière série de propriétés du fichier resx était quelque chose comme ceci:

  • Action de génération: une Ressource Incorporée
  • Copie vers le Répertoire de Sortie: Ne copiez pas
  • Outil Personnalisé: ResXFileCodeGenerator
  • Outil Personnalisé De L'Espace De Noms: Mon.Projet.S.Bon.Espace de noms

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X