web-dev-qa-db-fra.com

Que signifie MissingManifestResourceException et comment y remédier?

La situation:

  • J'ai une bibliothèque de classe, 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 uniquement cette méthode

Je reçois une MissingManifestResourceException avec le message suivant:

Impossible de trouver des ressources approprié pour la culture spécifiée ou la culture neutre. Assure-toi "Servers.Resources.resources" était correctement intégré ou lié à Assemblage "RT.Servers" à la compilation, ou que tous les assemblys satellites requis sont chargeables et entièrement signé.

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?

137
Timwi

Tout ce que j'avais à faire pour résoudre ce problème était de cliquer avec le bouton droit de la souris sur le fichier Resources.resx dans l'explorateur de solutions, puis de 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é manuellement au projet, la propriété Outil personnalisé du fichier doit être définie sur "ResXFileCodeGenerator".

Le problème est dû à une incompatibilité d'espaces de noms, qui se produit si vous modifiez "l'espace de noms par défaut" de l'assembly dans les paramètres du projet. (Je l'ai changé de (précédemment) "Servers" à (maintenant) "RT.Servers".)

Le code généré automatiquement dans Resources.Designer.cs contient 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" a dû être changée en "RT.Servers.Resources". Je l'ai fait manuellement, mais exécuter l'outil personnalisé l'aurait tout aussi bien fait.

220
Timwi

Je viens de rencontrer ce problème aujourd'hui et j'ai trouvé cette page d'aide et de support de Microsoft qui a réellement contourné le problème.

Quelques délégués se trouvaient en haut de mon fichier, dans l'espace de noms global, et tout à coup, je recevais un 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 délégués dans l'espace de noms, j'ai eu la même erreur. Enfin, j'ai mis les délégués dans la seule classe de ce fichier et l'erreur a disparu, mais je ne voulais pas les délégués 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. 

J'ai mis les délégués (que je ne considérerais pas comme "définitions de classe") au bas de ce fichier, en dehors de l'espace de noms local, et le programme n'a plus reçu la MissingManifestResourceException. Quelle erreur irritante. Mais cela semble être une solution plus robuste que de modifier le code généré automatiquement :)

32
Mark Rushakoff

J'ai rencontré un problème similaire et, même si je sais que ce n'est pas la cause du PO, je le posterai 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 à l'exécution (aucune erreur de compilation ni aucun avertissement), 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 .

23
Motti

J'ai eu le même problème, mais utiliser la commande Run Custom Tool comme suggéré par Timwi n'a pas aidé dans mon cas.

Cependant, cela me conduit dans la bonne direction, car je me suis retrouvé dans le fichier Properties du fichier .resx. Ici, j'ai remarqué une différence par rapport à un autre fichier .resx qui ne posait aucun problème.

Dans mon cas, je devais changer la propriété "Action de construction" de "Ressource" en "Ressource incorporée".

Ma meilleure hypothèse pour la raison est que j'avais le .resx dans une bibliothèque utilisée à partir d'une autre application. Mon application ne disposant pas de 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".

15
BlaM

Lorsque j'exécutais un problème similaire, dans Vs 2012, il s'est avéré que la propriété "Custom Tool Namespace" du fichier resx était erronée (dans mon cas, en fait, elle était non définie, le code généré a donc renvoyé cette exception à l'exécution). . Mon ensemble final de propriétés pour le fichier resx ressemblait à ceci:

  • Action de construction: Ressource incorporée
  • Copier dans le répertoire de sortie: Ne pas copier
  • Outil personnalisé: ResXFileCodeGenerator
  • Espace de noms d’outil personnalisé: My.Project.S.Proper.Namespace
11
Starnuto di topo

J'ai rencontré une cause différente de ce problème, qui n'était pas liée aux fichiers resx. J'avais une bibliothèque de classe où AssemblyInfo.cs contenait ce qui suit:

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

L'Assemblée ne contient aucun code WPF, dictionnaire ou dictionnaire de ressources. Je me suis débarrassé de l'exception en supprimant l'attribut ThemeInfo.

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

Une exception de première chance du type 'System.Resources.MissingManifestResourceException'.

En affichant les détails de l’exception, le système demandait MyAssembly.g.resources.

J'espère que cela pourrait être utile à quelqu'un d'autre.

3
bigfoot

J'ai eu le même problème, mais dans mon cas, je place une classe dans un contrôle utilisateur qui est lié au contrôle utilisateur comme ceci

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

La solution consistait à déplacer la 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

2
Smith

Voir aussi: MissingManifestResourceException lors de l'exécution de tests après la construction avec MSBuild (.mresource a un chemin dans manifest)

Je répète la réponse ici juste pour être complet:

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

<LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 

c’est-à-dire que l’entrée de ressource incorporée dans le fichier projet ressemble à ceci:

<ItemGroup>
  <EmbeddedResource Include="Properties\Resources.resx">
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>Resources.Designer.cs</LastGenOutput>
    <LogicalName>$(RootNamespace).Properties.Resources.resources</LogicalName> 
  </EmbeddedResource>
</ItemGroup>

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 le bogue semble toujours se produire. 

Mise à jour: le problème lié aux ressources (y compris XAML) semble être lié aux chemins de sortie et à l'utilisation de barres obliques inverses ou inverses, comme indiqué dans: Pourquoi la modification des répertoires de sortie du projet entraîne-t-elle: IOException n'a pas été gérée "Impossible de localiser la ressource 'app.xaml'."

2
nietras

Je ne suis pas sûr que cela aidera les gens, mais celui-ci a fonctionné pour moi:

Le problème que j’avais alors é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'ensemble "X" lors de la compilation, ou que tous les assemblys satellites requis sont chargeables et entièrement signés ".

J'essayais d'obtenir les ressources incorporées dans mon projet à partir d'une autre bibliothèque de classe.

Ce que j'ai fait pour résoudre le problème a été de définir le modificateur d'accès dans l'onglet Projet-> Propriétés-> Ressources de "Internal" (accessible uniquement dans la même bibliothèque de classes) sur "Public" (accessible depuis une autre bibliothèque de classes).

Alors courez et voilà, plus d'erreur pour moi ...

2
codingismylife

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

Je suis un utilisateur VS 2013. Après avoir traversé beaucoup de corrections mais pas de chance, j'ai essayé ceci:

  1. Cliquez avec le bouton droit sur le fichier de ressources, un par un, dans le cas de plusieurs fichiers.
  2. Assurez-vous que la propriété "Action de construction" est définie sur "Ressource incorporée".

C'est tout! :)

2
Jiten

Je suis 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 identique à celui du fichier de ressources.

Une fois que j'ai fait l'étape 2, l'exception est partie.

1
stormtrooper

Récemment rencontré le même problème, lutté un peu, trouvé ce sujet mais aucune réponse n’est 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 du mal à le résoudre, vérifiez votre StartupUri dans App.xaml.

1
Archeg

J'obtenais l'erreur MissingManifestResourceException après avoir transféré mon projet de VS2005 à VS2010. Aucune autre classe définie dans le fichier contenant ma classe Form n'est définie. Et j'ai également 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.

1
Winston

Dans mon cas, j'ai une API Web avec des ressources et je crée un paquet de pépites à partir de cela. Lorsque j'utilise cette nuget dans d'autres projets, je me rends compte que lorsque je demande une API avec des ressources, je reçois MissingManifestResourceException après une petite recherche, j'apprends que l'emballage de nuget ne compresse pas automatiquement les ressources. Si vous souhaitez utiliser des fichiers de ressources, vous devez le faire manuellement. Vous devez donc ajouter les lignes ci-dessous à votre fichier .nuspec: (Visitez https://github.com/NuGet/Home/issues/1482 )

<package> 
    <metadata>
    </metadata>
    <files>
        <file src="bin\Debug\en\MyAssembly.resource.dll" target="lib\net40\en\MyAssembly.resource.dll" />
        <file src="bin\Debug\es\MyAssembly.resource.dll" target="lib\net40\es\MyAssembly.resource.dll" />
    </files>
</package>

Mais avant d'ajouter des fichiers, vous devez savoir quelle version de .net vous utilisez.

0
dcy

J'ai eu ce problème lorsque j'ai ajouté une autre classe dans le fichier juste avant la classe qui dérive de Form. L'ajouter après avoir résolu le problème.

0
franckspike

J'avais avec un projet F # nouvellement créé . 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 seraient gérées . Si vous ne le faites pas voir la case à cocher puis mettez à jour votre Visual Studio! J'ai 15.6.7 installé. Dans 15.3.2, cette case à cocher n'est pas là.

0
KCT

Juste pour mentionner. Si vous utilisez une constante ou un littéral, assurez-vous qu'il se réfère à une ressource de la forme ProjectName.Resources et ne cp pas conserver Resources.resx.

Cela pourrait vous faire gagner une heure ou deux.

0
Herb

Parce que je suis en train de pré-compiler mon application Web (en utilisant la fonctionnalité de publication VS2012). Je recevais l'erreur ci-dessus. J'ai essayé toutes les suggestions, mais changer étrangement 'Build Action' en 'Content' a fait l'affaire!

0
Markive