Was bedeutet MissingManifestResourceException und wie kann das Problem behoben werden?

151

Die Situation:

  • Ich habe eine Klassenbibliothek namens RT.Servers, die einige Ressourcen enthält (vom Typ byte[], aber ich denke nicht, dass das wichtig ist).
  • Dieselbe Klassenbibliothek enthält eine Methode, die eine dieser Ressourcen zurückgibt
  • Ich habe ein einfaches Programm (mit einem Verweis auf diese Bibliothek), das nur diese einzelne Methode aufruft

Ich bekomme eine MissingManifestResourceExceptionmit folgender Nachricht:

Es konnten keine für die angegebene Kultur oder die neutrale Kultur geeigneten Ressourcen gefunden werden. Stellen Sie sicher, dass "Servers.Resources.resources" beim Kompilieren korrekt in die Assembly "RT.Servers" eingebettet oder verknüpft wurde oder dass alle erforderlichen Satelliten-Assemblys ladbar und vollständig signiert sind.

Ich habe noch nie mit Kulturen oder mit der Unterzeichnung von Versammlungen herumgespielt, deshalb weiß ich nicht, was hier los ist. Dies funktioniert auch in einem anderen Projekt, das dieselbe Bibliothek verwendet. Irgendwelche Ideen?

Timwi
quelle
2
Dies ist eine der nicht hilfreichen Ausnahmen in .NET. Es wird in mindestens drei Szenarien ausgelöst, die nichts gemeinsam haben.
rr-
1
Entschuldigung, aber es ist eine Microsoft-Methode: Entfernen Sie alle und fügen Sie sie erneut hinzu . Funktioniert für Ressourcen, NUGET, Referenzen und Verbindungszeichenfolgen. Es gibt viele Tools, aber Sie werden in
ungewöhnlichen

Antworten:

238

Alles, was ich tun musste, um dieses Problem zu beheben, war, mit der rechten Maustaste auf die Resources.resxDatei im Projektmappen-Explorer zu klicken und auf Benutzerdefiniertes Tool ausführen zu klicken . Dadurch wird die automatisch generierte Resources.Designer.csDatei neu generiert .

Wenn die .resx-Datei manuell zum Projekt hinzugefügt wurde, muss die Custom Tool-Eigenschaft der Datei auf "ResXFileCodeGenerator" festgelegt werden.

Das Problem ist auf eine Nichtübereinstimmung der Namespaces zurückzuführen, die auftritt, wenn Sie den "Standard-Namespace" der Assembly in den Projekteinstellungen ändern. (Ich habe es von (vorher) "Servers"in (jetzt) geändert "RT.Servers".)

Im automatisch generierten Code in Resources.Designer.csgibt es den folgenden Code:

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

Die wörtliche Zeichenfolge "Servers.Resources"musste in geändert werden "RT.Servers.Resources". Ich habe dies manuell gemacht, aber das Ausführen des benutzerdefinierten Tools hätte es genauso gut gemacht.

Timwi
quelle
9
Das hat mir viel Zeit gespart!
Eric
1
+1! In VS 2010 wird die oben gezeigte ResourceManager-Literalzeichenfolge zumindest für WinForms automatisch auf den Wert des Standardnamespace in den Projekteigenschaften (Registerkarte Anwendung) aktualisiert.
TrueWill
2
Was ist, wenn Sie keine Datei resources.resx haben?
Asche999
@ ashes999: Hast du im Ordner Eigenschaften nachgesehen? Dort ist es normalerweise zumindest für C # -Projekte.
RenniePet
Ich habe das gleiche Problem ausgeführt. Die .resx-Datei wurde manuell zum Projekt hinzugefügt, die Custom Tool-Eigenschaft der Datei, die ich auf "ResXFileCodeGenerator" gesetzt habe. Dann ist die resx-Datei zuerst und später die designer.vb-Datei später später .resx Datei. Wie kann ich es schaffen ...
Kavitha
37

Ich bin heute gerade auf dieses Problem gestoßen und habe diese Microsoft-Hilfe- und Support-Seite gefunden , die das Problem tatsächlich umgangen hat.

Ich hatte ein paar Delegierte oben in meiner Datei, im globalen Namespace, und plötzlich bekam ich MissingManifestResourceExceptionbeim Ausführen des Programms eine in dieser Zeile:

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

Dann habe ich die Delegaten in den Namespace verschoben, habe den gleichen Fehler bekommen. Schließlich habe ich die Delegaten in die einzige Klasse in dieser Datei eingefügt, und der Fehler ist verschwunden, aber ich wollte die Delegaten nicht in dieser Klasse oder diesem Namespace haben.

Dann bin ich oben auf diesen Link gestoßen, auf dem stand

Verschieben Sie alle anderen Klassendefinitionen so, dass sie nach der Klassendefinition des Formulars angezeigt werden, um dieses Problem zu beheben.

Ich habe die Delegaten (die ich nicht als "Klassendefinitionen" betrachten würde) am Ende dieser Datei außerhalb des lokalen Namespace platziert, und das Programm hat die nicht MissingManifestResourceExceptionmehr erhalten. Was für ein irritierender Fehler. Dies scheint jedoch eine robustere Lösung zu sein, als den automatisch generierten Code zu ändern :)

Mark Rushakoff
quelle
Danke für deine Antwort. Das klingt so, als hätten Sie ein anderes Problem, das das gleiche Symptom verursacht hat. Ich hatte keine zusätzlichen Klassen in meinem Code, tatsächlich hatte ich überhaupt keine Formulare. Ich sollte meine vorherige Antwort bearbeiten, da ich festgestellt habe, dass ich den automatisch generierten Code nicht ändern musste. Ich hätte den Codegenerator einfach erneut ausführen können, und er hätte sich selbst repariert. Keine Ahnung, warum der Erstellungsprozess dies nicht automatisch tat.
Timwi
7
Ich habe den Fehler erhalten, weil ich in der Datei Form1.cs eine Klasse über der Klasse des Formulars hinzugefügt habe (wie im Abschnitt "Auflösung" des von Ihnen angegebenen Links beschrieben). Vielen Dank!
Matt Smith
Gleiches Problem; nichts anderes funktionierte, also habe ich nur die Zeile gelöscht: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ this.Icon")));
Weil
Das ist die Antwort. Danke dir.
Sertan Pekel
Wenn jemand verwirrt war, hatte ich eine Klasse namens "StringExtensions" vor dem "Form1" -Bit von Form1.cs, ich habe sie unter Form1 in Form1.cs anstatt über oben verschoben und es hat funktioniert
Ma Dude
31

Ich bin auf ein ähnliches Problem gestoßen, und obwohl ich weiß, dass es nicht die Ursache für das OP ist, werde ich es hier veröffentlichen, damit eine Antwort verfügbar ist, wenn in Zukunft jemand anderes auf dieses Problem stößt.

Wenn Sie eine Klasse vor der Designer-Klasse hinzufügen, wird MissingManifestResourceExceptionzur Laufzeit eine Ausnahme angezeigt (kein Fehler oder Warnung zur Kompilierungszeit), da

Visual Studio erfordert, dass Designer die erste Klasse in der Datei verwenden.

Weitere Informationen finden Sie in diesem Beitrag .

Motti
quelle
12
Vielen Dank für die Veröffentlichung dieser "Antwort". Obwohl es in Bezug auf das OP-Problem "off topic" ist, war es eine gute Idee, es hier zu posten. Eine Suche nach MissingManifestResourceException führte mich zu diesem Thread, und Ihre Antwort war genau richtig für mein Problem.
RenniePet
16

Ich hatte das gleiche Problem, verwendete jedoch den von Timwi vorgeschlagenen Befehl " Benutzerdefiniertes Tool ausführen" habe nicht geholfen in meinem Fall.

Es führte mich jedoch in die richtige Richtung, da ich in den Eigenschaften der .resx- Datei landete . Hier habe ich einen Unterschied zu einem anderen .resx bemerkt Datei, der keine Probleme verursachte.

In meinem Fall musste ich die Eigenschaft "Build Action" von "Resource" in "Embedded Resource" ändern.

Meine beste Vermutung aus diesem Grund ist, dass ich die .resx in einer Bibliothek hatte, die von einer anderen Anwendung verwendet wurde. Meine Anwendung hatte keine eigene .resx- Datei, daher musste sie die aus der Bibliothek verwenden - die nur verfügbar ist, wenn sie in die Bibliothek eingebettet ist und nicht "eigenständig".

BlaM
quelle
2
+1 danke, ich habe meine Ressourcendateien überprüft, die sich ebenfalls in einer separaten Bibliothek befinden, auf die andere Anwendungen verweisen. Ich hatte Build Action auf Content gesetzt und nachdem ich es in Embedded Resource geändert hatte, funktionierte alles gut. Dummes Versehen
Shan Plourde
1
Vielen Dank! Dies funktionierte bei mir, wo ich einige Textdateien hatte, die Inhalte zum Testen oder einige Geschäftszuordnungsregeln enthielten. Der Wechsel von Inhalt zu eingebetteter Ressource hat das Problem behoben.
S. Baggy
12

Als ich in Vs 2012 ein ähnliches Problem ausführte, stellte sich heraus, dass die Eigenschaft "Custom Tool Namespace" der resx-Datei falsch war (in meinem Fall war sie tatsächlich nicht festgelegt, sodass der generierte Code diese Ausnahme zur Laufzeit auslöste). . Meine letzten Eigenschaften für die resx-Datei waren ungefähr so:

  • Aktion erstellen: Eingebettete Ressource
  • In Ausgabeverzeichnis kopieren : Nicht kopieren
  • Benutzerdefiniertes Tool: ResXFileCodeGenerator
  • Benutzerdefinierter Tool-Namespace: My.Project.S.Proper.Namespace
Starnuto di Topo
quelle
3

Siehe auch: MissingManifestResourceException beim Ausführen von Tests nach dem Erstellen mit MSBuild (.mresource hat einen Pfad im Manifest)

Ich wiederhole die Antwort hier nur der Vollständigkeit halber:

Das Hinzufügen von LogicalName zur Projektdatei behebt das Problem:

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

Das heißt, der eingebettete Ressourceneintrag in der Projektdatei sieht folgendermaßen aus:

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

Dies wird detailliert beschrieben in: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Beachten Sie, dass wir eine .resx-Datei verwenden, der Fehler jedoch weiterhin auftritt.

Update: Das Problem mit Ressourcen (inkl. XAML) scheint mit Ausgabepfaden und der Verwendung von Schrägstrichen in Vorwärts- oder Rückwärtsrichtung zu zusammenhängen, wie in: Warum führt das Ändern von Projektausgabeverzeichnissen zu folgenden Ursachen: IOException wurde nicht behandelt "Ressource 'app.xaml' kann nicht gefunden werden" . "

Nietras
quelle
Nach ungefähr acht Stunden Debuggen dieses Problems und buchstäblichem Durchsuchen aller Github-, SO- und Google-Antworten ist dies die Antwort, die mein Problem gelöst hat ... fwiw, mein Problem trat nach der Migration von .Net 3.5 auf 4.7.2 auf.
Neville
3

Ich bin auf eine andere Ursache für dieses Problem gestoßen, die nichts mit resx-Dateien zu tun hatte. Ich hatte eine Klassenbibliothek, in der AssemblyInfo.cs Folgendes enthielt:

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

Die Assembly enthielt keinen WPF-Code, kein Thema oder keine Ressourcenwörterbücher. Ich habe die Ausnahme durch Entfernen des ThemeInfo-Attributs beseitigt.

Ich habe nur keine wirkliche Ausnahme bekommen

Eine Ausnahme der ersten Chance vom Typ 'System.Resources.MissingManifestResourceException'.

Beim Anzeigen von Ausnahmedetails forderte das System MyAssembly.g.resources an

Ich hoffe, dies könnte jemand anderem helfen.

Bigfoot
quelle
2
Danke dafür! Genau das, was ich brauchte! Passiert, wenn Sie versehentlich ein ViewModel-Projekt als Steuerelementbibliothek erstellen.
Andrew Hanlon
Danke dir. Das hat es für mich behoben.
Jamleck
2

Ich bin mir nicht sicher, ob es den Leuten helfen wird, aber dieser hat für mich funktioniert:

Das Problem, das ich hatte, war, dass ich die folgende Nachricht erhielt:

Es konnten keine für die angegebene Kultur oder die neutrale Kultur geeigneten Ressourcen gefunden werden. Stellen Sie sicher, dass "My.Resources.Resources.resources" zum Zeitpunkt der Kompilierung korrekt in Assembly "X" eingebettet oder verknüpft wurde oder dass alle erforderlichen Satelliten-Assemblys ladbar und vollständig signiert sind. "

Ich habe versucht, die in mein Projekt eingebetteten Ressourcen aus einer anderen Klassenbibliothek abzurufen.

Um das Problem zu beheben, habe ich den Zugriffsmodifikator auf der Registerkarte Projekt-> Eigenschaften-> Ressourcen von "Intern" (nur innerhalb derselben Klassenbibliothek zugänglich) auf "Öffentlich" (von einer anderen Klassenbibliothek aus zugänglich) gesetzt.

Dann renn und voilà, kein Fehler mehr für mich ...

Kodierungismylife
quelle
2

Die von BlaM gegebene Lösung hat auch bei mir funktioniert.

Ich bin ein VS 2013-Benutzer. Nachdem ich viele Korrekturen durchlaufen hatte, aber kein Glück hatte, versuchte ich Folgendes:

  1. Klicken Sie bei mehreren Dateien mit der rechten Maustaste nacheinander auf die Ressourcendatei.
  2. Stellen Sie sicher, dass die Eigenschaft "Aktion erstellen" auf "Eingebettete Ressource" festgelegt ist.

Das ist es! :) :)

Jiten
quelle
Dies bestätigen. Ich habe ein funktionierendes Projekt, musste aber die Ressourcenbaugruppen separat verwalten. Deshalb habe ich versucht, von "Eingebettete Ressource" zu "Ressource" zu wechseln, und am Ende die MissingResourceManifestException erhalten.
Mosca Pt
2

Ich hatte das gleiche Problem, aber in meinem Fall platziere ich eine Klasse in einem Benutzersteuerelement, das mit dem Benutzersteuerelement wie diesem zusammenhängt

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

Die Lösung bestand darin, das so MyUserControlObjectan das Ende der Usercontrol-Klasse zu verschieben

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

ich hoffe das hilft

Schmied
quelle
Sprechen Sie über eine beschissene Fehlerbeschreibung ... Ich habe der CS-Datei des Hauptformulars eine Hilfsklasse hinzugefügt. Niemals hätte ich gedacht, dass die Fehlermeldung darauf zurückgreifen würde. Vielen Dank!
Adam Lewis
1

Ich habe den MissingManifestResourceException-Fehler erhalten, nachdem ich mein Projekt von VS2005 auf VS2010 portiert habe. In der Datei, die meine Formularklasse enthält, wurden keine anderen Klassen definiert. Außerdem hatte ich meinen resx-Ressourcendateinamen richtig eingestellt. Hat nicht funktioniert.

Also habe ich die resx-Dateien gelöscht und neu generiert. Alles gut jetzt.

Winston
quelle
1

Vor kurzem stieß ich auf das gleiche Problem, kämpfte ein wenig, fand dieses Thema, aber keine Antworten waren für mich richtig.

Mein Problem war , dass , wenn ich Hauptfenster von meinem WPF - Projekt entfernt (es ist nicht ein Hauptfenster hat), ich habe vergessen zu entfernen StartupUriaus App.xaml. Ich denke, diese Ausnahme kann auftreten, wenn Sie einen Fehler haben. StartupUriWenn also jemand damit zu kämpfen hat, melden Sie sich StartupUrian App.xaml.

Archeg
quelle
1

Ich bin kürzlich auf dieses Problem gestoßen und habe in meinem Fall einige Dinge getan:

  1. Stellen Sie sicher, dass die Namespaces in der Designer.cs-Datei der resx-Datei konsistent sind

  2. Stellen Sie sicher, dass der Standard-Namespace der Assembly (klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Eigenschaften) auf den Namespace festgelegt ist, in dem sich die Ressourcendatei befindet.

Nachdem ich Schritt 2 ausgeführt hatte, verschwand die Ausnahme.

Sturmtruppler
quelle
1

Ich hatte dieses Problem, als ich der Datei kurz vor der von Form abgeleiteten Klasse eine weitere Klasse hinzufügte. Das Hinzufügen nach dem Beheben des Problems.

franckspike
quelle
1

Der gleiche Fehler kann auch auftreten, wenn Sie eine neue Klasse in den Quellcode der Klasse eines vom Designer erstellten Formulars einfügen.

Diese neue Klasse kann entfernt und in einer anderen cs-Datei abgelegt werden.

(Zumindest in meinem Fall war dies das Problem ...)

István Nagy
quelle
0

Weil ich meine Webanwendung vorkompiliere (mithilfe der VS2012-Veröffentlichungsfunktion). Ich habe den obigen Fehler erhalten. Ich habe alle Vorschläge ausprobiert, aber die seltsame Änderung von "Build Action" in "Content" hat den Trick getan!

Markiv
quelle
0

In meinem Fall habe ich eine Web-API mit Ressourcen und erstelle daraus ein Nuget-Paket. Wenn ich dieses Nuget in anderen Projekten verwende, stelle ich fest, dass ich, wenn ich eine API mit Ressourcen MissingManifestResourceExceptionanfordere, nach ein wenig Nachforschungen erfahre, dass Nuget Packager Ressourcen nicht automatisch packt. Wenn Sie Ressourcendateien verwenden möchten, müssen Sie dies manuell tun. Daher müssen Sie Ihrer .nuspec-Datei folgende Zeilen hinzufügen: (Besuchen Sie 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>

Bevor Sie jedoch Dateien hinzufügen, müssen Sie sicher sein, welche .net-Version Sie verwenden.

dcy
quelle
0

Ich hatte das mit einem neu erstellten F # -Projekt. Die Lösung bestand darin, das Kontrollkästchen "Standardressourcennamen verwenden" in den Projekteigenschaften -> Anwendung -> Ressourcen / Angeben, wie Anwendungsressourcen verwaltet werden sollen, zu deaktivieren. Wenn Sie das Kontrollkästchen nicht sehen, aktualisieren Sie Ihr Visual Studio! Ich habe 15.6.7 installiert. In 15.3.2 ist dieses Kontrollkästchen nicht vorhanden.

KCT
quelle
0

Nur um es zu erwähnen. Wenn Sie eine Konstante oder ein Literal verwenden, stellen Sie sicher, dass es sich auf eine Ressource des Formulars bezieht ProjectName.Resourcesund nicht enthält Resources.resx.

Es könnte Ihnen ein oder zwei Stunden sparen.

Kraut
quelle
0

Ich habe dieses Problem bei einem verwalteten C ++ - Projekt festgestellt, das auf WinForms basiert, nachdem der globale Namespace umbenannt wurde (nicht manuell, sondern mit dem Umbenennungstool von VS2017).

Die Lösung ist einfach, wird aber an keiner anderen Stelle erwähnt.

Sie müssen den RootNamespaceEintrag in der vcxproj-Datei so ändern , dass er mit dem C ++ - Namespace übereinstimmt.

AntonK
quelle
0

In meinem Fall war es ein Tippfehler in der Xaml eines Fensters, das über Winforms Form geöffnet wurde:

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

Richtig: <Image Source="../Resources/WorkGreen.gif"/> Es kann jemandem helfen

tretom
quelle
-3

Von der Microsoft-Support-Seite :

Dieses Problem tritt auf, wenn Sie eine lokalisierte Ressource verwenden, die in einer Satellitenassembly vorhanden ist, die Sie mithilfe einer .resources-Datei mit einem unangemessenen Dateinamen erstellt haben. Dieses Problem tritt normalerweise auf, wenn Sie manuell eine Satellitenbaugruppe erstellen.

Geben Sie den Dateinamen der .resources-Datei an, wenn Sie Resgen.exe ausführen, um dieses Problem zu umgehen. Stellen Sie beim Angeben des Dateinamens der .resources-Datei sicher, dass der Dateiname mit dem Namespace-Namen Ihrer Anwendung beginnt. Führen Sie beispielsweise den folgenden Befehl an der Microsoft Visual Studio .NET-Eingabeaufforderung aus, um eine .resources-Datei zu erstellen, deren Namespace-Name Ihrer Anwendung am Anfang des Dateinamens steht:

Resgen strings.CultureIdentifier.resx 
MyApp.strings.CultureIdentifier.resources
TheVillageIdiot
quelle
1
Vielen Dank für Ihre Antwort, aber ich weiß nicht, was ResGen.exe ist. Ich habe es nie verwendet, und ehrlich gesagt möchte ich es nicht verwenden, weil ich nicht versuche, etwas Besonderes zu verwenden. Sicherlich muss es eine Möglichkeit geben, dies in Visual Studio zu beheben? Wie deklariere ich eine Ressource als nicht lokalisiert, da Sie beispielsweise sagen, dass die Ressource "lokalisiert" ist? Danke noch einmal.
Timwi