Que signifie MissingManifestResourceException et comment y remédier?

La situation:

  • J’ai une bibliothèque de classes, appelée RT.Servers , contenant quelques ressources (de type byte[] , mais je ne pense pas que ce soit important)
  • La même bibliothèque de classes contient une méthode qui renvoie une de ces ressources
  • J’ai un programme simple (avec une référence à cette bibliothèque) qui appelle seulement cette méthode unique

Je reçois une MissingManifestResourceException avec le message suivant:

Impossible de trouver des ressources appropriées pour la culture spécifiée ou la culture neutre. Assurez-vous que “Servers.Resources.resources” a été correctement incorporé ou lié à l’assembly “RT.Servers” au moment de la compilation, ou que tous les assemblys satellites requirejs sont chargeables et entièrement signés.

Je n’ai jamais joué avec les cultures, ni avec la signature de l’assemblée, alors je ne sais pas ce qui se passe ici. En outre, cela fonctionne dans un autre projet qui utilise la même bibliothèque. Des idées?

Tout ce que j’avais à faire pour résoudre ce problème consistait à cliquer avec le bouton droit sur le fichier Resources.resx dans l’Explorateur de solutions et à cliquer sur Exécuter l’outil personnalisé . Cela recrée le fichier Resources.Designer.cs généré automatiquement.

Si le fichier .resx a été ajouté au projet manuellement, la propriété Outil personnalisé du fichier doit être définie sur “ResXFileCodeGenerator”.

Le problème est dû à une incompatibilité des espaces de noms, qui se produit si vous modifiez le “namespace par défaut” de l’assembly dans les parameters du projet. (Je l’ai changé de (auparavant) "Servers" en (maintenant) "RT.Servers" .)

Dans le code généré automatiquement dans 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 remplacée par "RT.Servers.Resources" . Je l’ai fait manuellement, mais l’exécution de l’outil personnalisé aurait également bien fonctionné.

Je viens de trouver ce problème aujourd’hui, et j’ai trouvé cette page d’aide et de support Microsoft qui contournait le problème.

J’avais quelques delegates en haut de mon fichier, dans l’espace de noms global, et tout à coup je MissingManifestResourceException une MissingManifestResourceException lors de l’exécution du programme, sur cette ligne:

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

Ensuite, j’ai déplacé les delegates dans l’espace de noms, j’ai eu la même erreur. Enfin, j’ai mis les delegates dans la seule classe de ce fichier, et l’erreur a disparu, mais je ne voulais pas que les delegates soient dans cette classe ou cet espace de noms.

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

Pour résoudre ce problème, déplacez toutes les autres définitions de classe afin qu’elles apparaissent après la définition de classe du formulaire.

Je mets les delegates (que je ne considérerais pas “définitions de classes”) au bas de ce fichier, en dehors de l’espace de noms local, et le programme n’a plus reçu le MissingManifestResourceException . Quelle erreur irritante. Mais, cela semble être une solution plus robuste que la modification du code généré automatiquement 🙂

J’ai rencontré un problème similaire et, même si je sais que ce n’est pas la cause de l’OP, je l’enverrai ici afin que si quelqu’un d’autre rencontre ce problème à l’avenir, une réponse soit disponible.

Si vous ajoutez une classe avant la classe de concepteur, vous obtiendrez une exception MissingManifestResourceException au moment de l’exécution (pas d’erreur ou d’avertissement de compilation) car

Visual Studio nécessite que les concepteurs utilisent la première classe du fichier.

Pour (légèrement) plus d’informations, voir cet article .

J’ai eu le même problème, mais l’utilisation de la commande Run Custom Tool suggérée par Timwi n’a pas aidé dans mon cas.

Cependant, cela m’a conduit dans la bonne direction, car je me suis retrouvé dans les propriétés du fichier .resx . Ici, j’ai remarqué une différence avec un autre fichier .resx qui ne posait aucun problème.

Dans mon cas, j’ai dû changer la propriété “Build Action” de “Resource” à “Embedded Resource”.

Ma meilleure supposition pour la raison est que j’avais le fichier .resx dans une bibliothèque qui était utilisée par une autre application. Mon application ne possédait pas son propre fichier .resx , elle devait donc utiliser celui de la bibliothèque – qui n’est disponible que lorsqu’il est intégré à la bibliothèque et non “autonome”.

Lorsque je lance dans un problème similaire, dans Vs 2012, il s’est avéré que la propriété “Custom Tool Namespace” du fichier resx était incorrecte (dans mon cas, en fait, elle était désactivée, donc le code généré contenait cette exception à l’exécution) . Mon ensemble final de propriétés pour le fichier resx ressemblait à ceci:

  • Action de génération : Ressource intégrée
  • Copier dans le répertoire de sortie: ne pas copier
  • Outil personnalisé: ResXFileCodeGenerator
  • Espace de noms de l’outil personnalisé: My.Project.S.Proper.Namespace

J’ai rencontré une autre cause de ce problème, qui n’était pas lié aux fichiers resx. J’avais une bibliothèque de classes où AssemblyInfo.cs contenait les éléments suivants:

 [assembly: ThemeInfo( ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)] 

L’assembly ne contenait aucun code WPF, aucun dictionnaire ou dictionnaires de ressources. Je me suis débarrassé de l’exception en supprimant l’atsortingbut ThemeInfo.

Je n’ai pas eu d’exception réelle, seulement

Une première exception de type “System.Resources.MissingManifestResourceException”.

En consultant les détails des exceptions, le système demandait MyAssembly.g.resources

J’espère que cela pourrait aider quelqu’un d’autre.

Pas sûr que cela aidera les gens mais celui-ci a fonctionné pour moi:

Donc, le problème était que je recevais le message suivant:

Impossible de trouver des ressources appropriées pour la culture spécifiée ou la culture neutre. Assurez-vous que “My.Resources.Resources.resources” a été correctement incorporé ou lié à l’assembly “X” au moment de la compilation ou que tous les assemblys satellites requirejs sont chargeables et entièrement signés ”

J’essayais d’obtenir les ressources intégrées à mon projet à partir d’une autre bibliothèque de classes.

Ce que j’ai fait pour résoudre le problème consistait à définir le modificateur d’access dans l’onglet Projet-> Propriétés-> Ressources de “Interne” (accessible uniquement dans la même bibliothèque de classes) à “Public” (accessible depuis une autre bibliothèque de classes)

Alors cours et voilà, plus d’erreur pour moi …

Voir aussi: MissingManifestResourceException lors de l’exécution de tests après la création avec MSBuild (.mresource a le chemin dans le manifeste)

Je répète la réponse ici pour compléter:

Il semble que l’ajout de LogicalName au fichier de projet le corrige:

 $(RootNamespace).Properties.Resources.resources 

Ainsi, l’entrée de ressource incorporée dans le fichier de projet ressemble à ceci:

   ResXFileCodeGenerator Resources.Designer.cs $(RootNamespace).Properties.Resources.resources   

Ceci est détaillé dans: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Notez que nous utilisons un fichier .resx, mais que le bogue semble toujours se produire.

Mise à jour: Le problème avec les ressources (y compris XAML) semble être lié aux chemins de sortie et à l’utilisation de barres obliques comme décrit dans: Pourquoi la modification des répertoires de sortie du projet provoque-t-elle une IOException? . ”

La solution proposée par BlaM a également fonctionné pour moi.

Je suis un utilisateur de VS 2013. Après avoir traversé de nombreuses corrections mais sans succès, j’ai essayé ceci:

  1. Cliquez avec le bouton droit sur le fichier de ressources, un par un, en cas de fichiers multiples.
  2. Assurez-vous que la propriété “Build Action” est définie sur “Embedded Resource”.

C’est tout! 🙂

J’ai eu le même problème, mais dans mon cas, je place une classe dans un contrôle d’utilisateur qui est lié au contrôle d’utilisateur comme celui-ci.

 Public Class MyUserControlObject end Class Public Class MyUserCOntrol end Class 

La solution était de déplacer le MyUserControlObject à la fin de la classe Usercontrol, comme ceci

 Public Class MyUserCOntrol end Class Public Class MyUserControlObject end Class 

J’espère que ça aide

Je recevais l’erreur MissingManifestResourceException après avoir porté mon projet de VS2005 à VS2010. Je n’ai pas défini d’autres classes dans le fichier contenant ma classe Form. Et j’ai aussi eu mon nom de fichier de ressource resx défini correctement. N’a pas fonctionné

J’ai donc supprimé les fichiers resx et les ai régénérés. Tout va bien maintenant

Récemment rencontré le même problème, lutté un peu, trouvé ce sujet, mais aucune réponse n’était correcte pour moi.

Mon problème était que lorsque j’ai supprimé la fenêtre principale de mon projet WPF (il n’a pas de fenêtre principale), j’ai oublié de supprimer StartupUri de App.xaml . Je suppose que cette exception peut se produire si vous avez une erreur dans StartupUri , donc si quelqu’un a des difficultés avec ceci – vérifiez votre StartupUri dans App.xaml .

Parce que je pré-comstack mon application Web (en utilisant la fonctionnalité de publication de VS2012). J’avais l’erreur ci-dessus. J’ai essayé toutes les suggestions, mais changer bizarrement ‘Build Action’ en ‘Content’ a fait l’affaire!

Dans mon cas, j’ai un api web avec des ressources et je crée un paquet nuget à partir de cela. Lorsque j’utilise ce nuget dans d’autres projets, je me rends compte que lorsque je demande une API avec des ressources, j’obtiens une exception MissingManifestResourceException après un peu de recherche. Si vous souhaitez utiliser des fichiers de ressources, vous devez le faire manuellement. Vous devez donc append les lignes suivantes à votre fichier .nuspec: (Visitez https://github.com/NuGet/Home/issues/1482 )

         

Mais avant d’append des fichiers, vous devez être sûr de la version de .net que vous utilisez.

Récemment tombé sur cette question, dans mon cas, j’ai fait quelques choses:

  1. Assurez-vous que les espaces de noms sont cohérents dans le fichier Designer.cs du fichier resx

  2. Assurez-vous que l’espace de noms par défaut de l’assembly (cliquez avec le bouton droit sur le projet et choisissez Propriétés) est défini de la même manière que l’espace de noms dans lequel se trouve le fichier de ressources.

Une fois que j’ai fait l’étape 2, l’exception a disparu.

J’ai eu avec un projet nouvellement créé F #. La solution consistait à décocher “Utiliser les noms de ressources standard” dans les propriétés du projet -> Application -> Ressources / Spécifier comment les ressources de l’application seront gérées. Si vous ne voyez pas la case à cocher, mettez à jour votre Visual Studio! J’ai 15.6.7 installé. Dans 15.3.2 cette case à cocher n’est pas là.

À partir de la page de support de Microsoft :

Ce problème se produit si vous utilisez une ressource localisée qui existe dans un assembly satellite que vous avez créé à l’aide d’un fichier .resources qui a un nom de fichier inapproprié. Ce problème se produit généralement si vous créez manuellement un assembly satellite.

Pour contourner ce problème, spécifiez le nom de fichier du fichier .resources lorsque vous exécutez Resgen.exe. Pendant que vous spécifiez le nom du fichier .resources, assurez-vous que le nom du fichier commence par le nom de l’espace de noms de votre application. Par exemple, exécutez la commande suivante à l’invite de commandes Microsoft Visual Studio .NET pour créer un fichier .resources contenant le nom d’espace de noms de votre application au début du nom de fichier:

 Resgen ssortingngs.CultureIdentifier.resx MyApp.ssortingngs.CultureIdentifier.resources