Que signifie MissingManifestResourceException et comment y remédier?

151

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 l'une de ces ressources
  • J'ai un programme simple (avec une référence à cette bibliothèque) qui n'appelle que cette seule méthode

J'obtiens un MissingManifestResourceExceptionavec 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 intégré ou lié dans l'assembly «RT.Servers» au moment de la compilation, ou que tous les assemblys satellites requis sont chargeables et entièrement signés.

Je n'ai jamais joué avec les cultures, ni avec la signature de l'assemblée, donc 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?

Timwi
la source
2
C'est l'une des exceptions les moins utiles de .NET. Il se déclenche dans au moins 3 scénarios qui n'ont rien en commun.
rr-
1
Désolé, mais c'est une méthode Microsoft: supprimez tout, puis ajoutez à nouveau . Fonctionne pour les ressources, NUGET, les références et les chaînes de connexion. Il existe de nombreux outils, mais vous passerez du temps pour les fichiers bruts dans des cas
inhabituels

Réponses:

238

Tout ce que j'avais à faire pour résoudre ce problème était de cliquer avec le bouton droit sur le Resources.resxfichier dans l'Explorateur de solutions et de cliquer sur Exécuter l'outil personnalisé . Cela recrée le Resources.Designer.csfichier 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 (auparavant) "Servers"à (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"a dû être remplacée par "RT.Servers.Resources". Je l'ai fait manuellement, mais exécuter l'outil personnalisé l'aurait également bien fait.

Timwi
la source
9
Cela m'a fait gagner beaucoup de temps!
Eric
1
+1! Dans VS 2010, la chaîne littérale ResourceManager indiquée ci-dessus est automatiquement mise à jour à la valeur de l'espace de noms par défaut dans les propriétés du projet (onglet Application), au moins pour WinForms.
TrueWill
2
Que faire si vous n'avez pas de fichier resources.resx?
ashes999 le
@ ashes999: Avez-vous regardé dans le dossier Propriétés? C'est là que c'est généralement pour les projets C # au moins.
RenniePet
J'ai couru le même problème.Le fichier .resx a été ajouté au projet manuellement, la propriété Outil personnalisé du fichier que j'ai défini sur "ResXFileCodeGenerator". Le fichier resx est le premier et plus tard le fichier designer.vb plus tard. Le fichier desinger d'Actully est le premier et plus tard, fichier .resx. comment puis-je le faire ....
Kavitha
37

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

J'avais quelques délégués en haut de mon fichier, dans l'espace de noms global, et tout à coup, j'obtenais un MissingManifestResourceExceptionlors 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 que les délégués 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.

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

Mark Rushakoff
la source
Merci pour votre réponse. Cela ressemble à un problème différent qui a causé le même symptôme. Je n'avais pas de classes supplémentaires dans mon code, en effet je n'avais même pas de formulaires du tout. Je devrais modifier ma réponse précédente car j'ai découvert que je n'avais pas vraiment besoin de modifier le code généré automatiquement. J'aurais pu simplement relancer le générateur de code, et il se serait corrigé. Aucune idée pourquoi le processus de construction ne l'a pas fait automatiquement.
Timwi
7
J'ai eu l'erreur en raison de l'ajout d'une classe au-dessus de la classe du formulaire dans le fichier Form1.cs (comme indiqué dans la section «Résolution» du lien que vous avez fourni). Merci!
Matt Smith
Même problème; rien d'autre ne fonctionnait donc j'ai simplement supprimé la ligne: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ this.Icon"))); parce que je ne me soucie pas de l'icône sous cette forme particulière :)
Gary Huckabone
Voilà la réponse. Je vous remercie.
Sertan Pekel
Si quelqu'un était confus, j'avais une classe appelée "StringExtensions" avant le bit "Form1" de Form1.cs, je l'ai déplacée sous Form1 dans form1.cs au lieu de ci-dessus et cela a fonctionné
Ma Dude
31

J'ai rencontré un problème similaire et, bien que je sache 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 MissingManifestResourceExceptionexception à l'exécution (pas d'erreur ou d'avertissement à la compilation) car

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

Pour (légèrement) plus d'informations, consultez cet article .

Motti
la source
12
Merci d'avoir publié cette "réponse". Bien que ce soit "hors sujet" par rapport au problème du PO, c'était une bonne idée de l'afficher ici. Une recherche de MissingManifestResourceException m'a conduit à ce fil de discussion, et votre réponse était parfaite pour mon problème.
RenniePet
16

J'ai eu le même problème, mais l'utilisation de la commande Exécuter l'outil personnalisé comme suggéré 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 n'a causé aucun problème.

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

Ma meilleure estimation pour la raison est que j'avais le .resx dans une bibliothèque qui a été utilisée à partir d'une autre application. Mon application n'avait pas son propre fichier .resx , elle devait donc utiliser celui de la bibliothèque - qui n'est disponible que lorsqu'il est incorporé dans la bibliothèque et non "autonome".

BlaM
la source
2
+1 merci, j'ai revérifié mes fichiers de ressources qui se trouvent également dans une bibliothèque séparée référencée par d'autres applications. J'avais Build Action réglé sur Content, et après l'avoir changé en Embedded Resource, tout fonctionnait bien. Oubli stupide
Shan Plourde
1
Merci! Cela a fonctionné pour moi où j'avais des fichiers texte contenant du contenu à tester ou des règles de mappage métier. Le passage du contenu à la ressource intégrée a résolu le problème.
S.Baggy
12

Lorsque je lance un problème similaire, dans Vs 2012, il s'est avéré que la propriété "Espace de nom de l'outil personnalisé" du fichier resx était erronée (dans mon cas, en fait, elle n'était pas définie, donc le code généré a produit cette exception lors de l'exécution) . Mon ensemble final de propriétés pour le fichier resx était quelque chose comme ceci:

  • Action de construction: ressource intégrée
  • Copier dans le répertoire de sortie: ne pas copier
  • Outil personnalisé: ResXFileCodeGenerator
  • Espace de nom de l'outil personnalisé: My.Project.S.Proper.Namespace
Starnuto di topo
la source
3

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

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

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 intégrée dans le fichier de 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 avec les ressources (y compris XAML) semble être lié aux chemins de sortie et à l'utilisation de barres obliques vers l'avant ou vers l'arrière, comme indiqué dans: Pourquoi la modification des répertoires de sortie du projet provoque-t-elle: IOException n'a pas été gérée "Impossible de localiser la ressource 'app.xaml' . "

nietras
la source
Après environ huit heures de débogage de ce problème, et littéralement parcouru chaque réponse github, SO et Google, c'est la réponse qui a résolu mon problème ... fwiw, mon problème a commencé à se produire après la migration de .Net 3.5 vers 4.7.2.
Neville
3

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 classes où AssemblyInfo.cs contenait ce qui suit:

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

L'assembly ne contenait aucun code WPF, thème ou dictionnaires 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 de type «System.Resources.MissingManifestResourceException».

Affichage des détails de l'exception, le système demandait MyAssembly.g.resources

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

bigfoot
la source
2
Merci pour ça! Exactement la solution dont j'avais besoin! Se produit lorsque vous créez accidentellement un projet ViewModel en tant que bibliothèque de contrôle.
Andrew Hanlon
Je vous remercie. Cela a résolu le problème pour moi.
Jamleck
2

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

Donc, le problème que j'ai eu é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» était correctement intégré ou lié à l'assembly «X» au moment de la compilation, ou que tous les assemblys satellites requis sont chargeables et entièrement signés »

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

Ce que j'ai fait pour résoudre le problème était de définir le modificateur d'accès 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 lancez et voilà, plus d'erreur pour moi ...

codingismylife
la source
2

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

Je suis un utilisateur VS 2013. Après avoir traversé de nombreuses corrections mais pas de chance, 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! :)

Jiten
la source
Confirmer cela. J'ai un projet de travail mais j'avais besoin de maintenir séparément les assemblys de ressources, j'ai donc essayé de passer de "Embedded Resource" à simplement "Resource" et j'ai fini par obtenir l'exception MissingResourceManifestException.
Mosca Pt
2

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 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

Forgeron
la source
Parlez d'une description d'erreur merdique ... J'ai ajouté une classe d'aide au fichier CS du formulaire principal. Jamais je n'aurais deviné que le message d'erreur renverrait à cela. Merci!
Adam Lewis
1

J'obtenais l'erreur MissingManifestResourceException après avoir porté mon projet de VS2005 à VS2010. Je n'avais aucune autre classe définie dans le fichier contenant ma classe Form. Et j'ai également fait définir correctement mon nom de fichier de ressources resx. Ça n'a pas marché.

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

Winston
la source
1

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 (elle n'a pas de fenêtre principale), j'ai oublié de supprimer StartupUride App.xaml. Je suppose que cette exception peut se produire si vous avez une erreur StartupUri, donc au cas où si quelqu'un a du mal à ce sujet - vérifier votre StartupUrien App.xaml.

Archeg
la source
1

Récemment tombé sur ce problème, 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.

stormtrooper
la source
1

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

franckspike
la source
1

La même erreur peut également se produire lorsque vous placez une nouvelle classe dans le code source d'une classe de formulaire créée par un concepteur.

Cette nouvelle classe peut être supprimée et placée dans un autre fichier cs.

(Au moins dans mon cas, c'était le problème ...)

István Nagy
la source
0

Parce que je pré-compile mon application Web (en utilisant la fonction de publication VS2012). J'obtenais l'erreur ci-dessus. J'ai essayé toutes les suggestions, mais changer bizarrement «Action de construction» en «Contenu» a fait l'affaire!

Markive
la source
0

Dans mon cas, j'ai une API Web avec des ressources et je crée un package 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, MissingManifestResourceExceptionaprès quelques recherches, j'apprends que le packager de nuget n'emballe 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 être sûr de la version de .net que vous utilisez.

dcy
la source
0

J'ai eu le avec un projet F # nouvellement créé. La solution était de 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 installé 15.6.7. Dans 15.3.2, cette case à cocher n'est pas là.

KCT
la source
0

Juste pour mentionner. Si vous utilisez une constante ou un littéral, assurez-vous qu'il fait référence à une ressource du formulaire ProjectName.Resourceset ne cpntain Resources.resx.

Cela pourrait vous faire gagner une heure ou deux.

Herbe
la source
0

J'ai rencontré ce problème avec un projet C ++ géré basé sur WinForms après avoir renommé l'espace de noms global (pas manuellement, mais avec l'outil Renommer de VS2017).

La solution est simple, mais n'est pas mentionnée ailleurs.

Vous devez modifier l' RootNamespaceentrée dans vcxproj-file pour qu'elle corresponde à l'espace de noms C ++.

AntonK
la source
0

Dans mon cas, c'était une faute de frappe dans le Xaml d'une fenêtre ouverte à partir du formulaire Winforms:

Incorrect: <Image Source="/Resources/WorkGreen.gif"/>

Correct: <Image Source="../Resources/WorkGreen.gif"/> cela peut aider quelqu'un

tretom
la source
-3

Sur la page de support 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. Lorsque vous spécifiez le nom de fichier du fichier .resources, assurez-vous que le nom de 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 qui porte le nom d'espace de noms de votre application au début du nom de fichier:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources
TheVillageIdiot
la source
1
Merci pour votre réponse, mais je ne sais pas ce qu'est ResGen.exe, je ne l'ai jamais utilisé, et franchement je ne veux pas l'utiliser car je n'essaye pas d'utiliser quelque chose d'extraordinaire. Il doit sûrement y avoir un moyen de résoudre ce problème à partir de Visual Studio? Par exemple, puisque vous dites que la ressource est "localisée", comment déclarer une ressource comme non localisée? Merci encore.
Timwi