Ich habe zwei ASP.NET-Webprojekte (ProjectA und ProjectB). Wenn die Klasse in ProjectA eine Klasse von ProjectB instanziiert, die eine Ressourcendatei Blah.resx verwendet, wird folgende Fehlermeldung angezeigt:
Eine Ausnahme vom Typ 'System.Resources.MissingManifestResourceException' ist in mscorlib.dll aufgetreten, wurde jedoch im Benutzercode nicht behandelt.
Es konnten keine für die angegebene Kultur oder die neutrale Kultur geeigneten Ressourcen gefunden werden. Stellen Sie sicher, dass "Resources.Blah.resources" zur Kompilierungszeit korrekt in die Assembly "App_GlobalResources.sn_flri6" eingebettet oder verknüpft wurde oder dass alle erforderlichen Satelliten-Assemblys ladbar und vollständig signiert sind.
Was verursacht das?
Auf der Microsoft-Website gibt es einen Artikel zu diesem http://support.microsoft.com/kb/318603, der Folgendes vorschlägt:
Verschieben Sie alle anderen Klassendefinitionen so, dass sie nach der Klassendefinition des Formulars angezeigt werden, um dieses Problem zu beheben.
Dies ist eine Lösung für Windows Forms-Projekte. Ich bin mir nicht sicher, ob dies auch für Webprojekte gilt.
quelle
To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.
Dies hat mein Problem gelöst.GetGlobalResourceObject
Antworten:
Ich habe gerade dieselbe Ausnahme in einem WPF-Projekt getroffen. Das Problem trat in einer Assembly auf, die wir kürzlich in einen anderen Namespace verschoben haben (
ProblemAssembly.Support
toProblemAssembly.Controls
) . Die Ausnahme trat auf, wenn versucht wurde, über eine zweite in der Assembly vorhandene Ressourcendatei auf Ressourcen zuzugreifen.Es stellte sich heraus, dass die zusätzliche Ressourcendatei Referenzen nicht ordnungsgemäß vom alten Namespace-Namen in den neuen Namespace-Namen verschoben hat.
In der Datei designer.cs für die Ressourcendatei gibt es eine statische Eigenschaft, um den ResourceManager abzurufen. Innerhalb dieses Getters bezog sich die Zeichenfolge immer noch auf den alten Namespace. Nach der Korrektur im neuen Namespace wurde das Problem behoben:
gewesen sein sollte:
Hoffe das hilft der nächsten Person.
quelle
Ich habe das Problem folgendermaßen gelöst:
Es funktioniert perfekt.
quelle
Als ich versuchte, eine resource.resx-Datei aus einem C # -Projekt mit einem anderen C # -Projekt zu teilen, trat dieses Problem auf. Der Vorschlag, die Form-Klasse an den Anfang ihrer Datei zu verschieben, war nicht angemessen. So habe ich es gelöst. Sie verwenden im Wesentlichen einen Link vom zweiten zum ersten Projekt und aktivieren dann die Regeneration der
resource.designer.cs
Datei.Properties/Resources.resx
Datei des zweiten ProjektsProperties/Resources.resx
Datei des ersten Projekts als LINK zum Ordner Eigenschaften im zweiten Projekt hinzu. Fügen Sie es nicht zur Stammebene des Projekts hinzu.Properties/Resources.designer.cs
!Resources.resx
, fügen SieResXFileCodeGenerator
als CustomResources.resx
und wählen Sie "Benutzerdefiniertes Tool ausführen". Dadurch wird eine neue Datei designer.cs generiert.Hinweis: Ich würde es vermeiden, die Datei resource.designer.cs zu bearbeiten, da diese automatisch generiert wird.
quelle
In meinem Fall hatte eine Reihe von schlecht durchdachten globalen Textersetzungen diese Zeile in der CS-Datei des Ressourcendesigners versehentlich geändert.
Da der Namespace in diesem Argument nicht mehr mit dem Namespace der Klasse übereinstimmt, wurde die Anwendung zur Laufzeit verwirrt.
Überprüfen Sie, ob der Namespace des Designers mit dem Zeichenfolgenargument in dieser Zeile übereinstimmt.
quelle
Dies geschieht, weil das
*.resх
von der Migration ausgeschlossen ist.quelle
Ich habe festgestellt, dass das Löschen der Datei designer.cs, das Ausschließen der resx-Datei aus dem Projekt und das anschließende erneute Einfügen dieses Problems häufig nach einem Namespace-Refactoring behoben wurde (gemäß der Antwort von CFinck).
quelle
Niemand scheint diese Lösung erwähnt zu haben. Wirklich offensichtlich - aber stolperte mich für einen Moment ...
Der Standardzugriffsmodifikator für eine neue Ressourcendatei ist
Internal
(oderFriend
in VB.Net). Stellen Sie sicher, dass Sie dies in ändernPublic
(Im Resx-Designer befindet sich oben ein Dropdown-Menü für den Zugriffsmodifikator.)
quelle
Die Antwort von Sibi Elangos allein reichte mir nicht aus, also musste ich
Dies wird einen App_GlobalResources in Ihrem generieren
/bin
Ordner, jetzt kopieren Sie diesen Ordner auch auf die Wurzel der Web - Anwendungquelle
In meinem Fall das Problem, das durch die falsche Definition der Klasse verursacht wurde:
Nach der Neuzuweisung
BackendObject
bis zum Ende (besser zum Trennen der Datei) wurde das Problem durch Projektbereinigung + Neuerstellung behoben.quelle
Ich habe dieses Problem behoben, indem ich zu dem Projekt gegangen bin, in dem meine Ressourcendatei gespeichert wurde, zu der ItemGroup gescrollt und einen logischen Namen hinzugefügt habe, der dem vom Compiler erwarteten Pfad entspricht.
Meine EmbeddedResource sah folgendermaßen aus:
Jetzt sieht es so aus
quelle
Überprüfen Sie in diesem Fall, ob für die Assembly, die Ressourcen enthält, der Standard-Namespace auf denselben Text festgelegt ist (Projekt-> Eigenschaften-> Standard-Namespace; in VS). Überprüfen Sie auch, ob für die resx-Datei die Eigenschaft BuildAction auf "Eingebettet" festgelegt ist Ressource "Viel Spaß ...;)
quelle
Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
Ein Ansatz wäre, die gemeinsam genutzten Klassen / Ressourcen in ein separates Klassenbibliotheksprojekt zu stellen und auf beide Websites zu verweisen.
quelle
Danke @CFinck! Nur um anderen einen Tipp hinzuzufügen: Ich habe die ResourceManager-Zeile folgendermaßen geändert:
Ich bin in vb.net, aber ich denke, in C # wäre der einzige Unterschied + anstelle von &, um Zeichenfolgen zu verketten.
Auf diese Weise kann ich dieselben verknüpften Assembly-Dateien in zwei ähnlichen Projekten verwenden, die die Ressourcen gemeinsam nutzen.
quelle
Dieser Fehler wird auch von Dotfuscation ausgelöst, da eine Resx-Designer-Datei auf Reflexion beruht. Wenn Sie Dotfuscator verwenden, werden Ihre Resx-Dateien beschädigt. Sie müssen sie immer als Ausschluss vom Verschleierungsprozess hinzufügen.
quelle
Als wir benutzten
Dieser Fehler würde generiert, wenn wir diesen Aufruf nicht in eine try / catch-Anweisung einschließen.
quelle
Ich habe eine WinForms-Anwendung mit einem einzelnen Projekt in der Lösung.
Targeting
.NET Framework 4.0
Verwenden
SharpDevelop 4.3
als meine IDEKlingt albern, aber ich habe zufällig die
Logical Name
Eigenschaft in"Resources"
meiner"Resources.resx"
Datei festgelegt. Sobald ich diese Eigenschaft geräumt habe, funktioniert alles gut.Normalerweise, wenn Sie zufällige Dateien als hinzufügen
EmbeddedResource
, möchten Sie im Allgemeinen dasLogical Name
auf etwas Vernünftiges einstellen , aus irgendeinem Grund habe ich das gleiche für dieResources.resx
Datei getan und das hat alles vermasselt ...Hoffe das hilft jemandem.
quelle
Für mich bestand das Problem darin, .resx-Dateien und zugehörige .cs-Dateien von einem Projekt in ein anderes zu kopieren. Beide Projekte hatten den gleichen Namespace, das war also nicht das Problem.
Schließlich wurde es gelöst, als ich im Projektmappen-Explorer feststellte, dass die .resx-Dateien im ursprünglichen Projekt von den .cs-Dateien abhängig waren:
Während des kopierten Projekts waren die CS-Dateien von den RESX-Dateien abhängig:
Es stellte sich heraus, dass im zweiten Projekt die .resx-Dateien so eingestellt waren, dass die .cs-Dateien automatisch generiert wurden. Die automatisch generierten CS-Dateien überschrieben die aus dem ursprünglichen Projekt kopierten CS-Dateien.
Um das Problem zu beheben, bearbeiten Sie die Eigenschaften jeder .resx-Datei im kopierten Projekt. Die Custom Tool- Eigenschaft wird auf etwa ResXFileCodeGenerator festgelegt . Löschen Sie die Custom Tool- Eigenschaft der .resx-Datei. Sie müssen die CS-Datei aus dem ursprünglichen Projekt erneut kopieren, da sie von der automatisch generierten Datei überschrieben wurde.
quelle
In meinem Fall hatte ich eine neue Klasse über ein Windows-Formular in derselben Datei platziert.
Das Verschieben der neu hinzugefügten Klasse aus dieser Datei hat das Problem behoben.
Siehe hier: http://i.stack.imgur.com/wVu6c.png
quelle
Dies kann durch nicht übereinstimmende Namespaces verursacht werden. Die zweite Antwort von oben (Sibi Elangos) besagt, dass Sie mit der rechten Maustaste auf die Resx-Datei klicken und die Build-Option in EmbeddedResource ändern sollen, aber das hatte ich bereits getan und hatte immer noch den Fehler. In der Top-Antwort (CFinck's) wird eine Möglichkeit angegeben, dies durch manuelles Bearbeiten von Dateien zu beheben. Ich hatte jedoch dieses Problem in MonoDevelop und musste den Standard-Namespace auf den gleichen Wert festlegen wie die cs-Datei, die die Ressource aufrief (die Datei, die enthaltener Code wie der folgende Code) ...
Nach dem Festlegen des Standard-Namespace über die GUI verursachte die obige Zeile keine Ausnahme mehr.
quelle
Nur ein weiterer Fall. Ich habe eine Lösung mit zwei Projekten kopiert und sie teilweise im Windows-Explorer (Ordnernamen, .sln- und .csproj-Dateinamen) und teilweise mit einer massiven Aktion zum Suchen und Ersetzen in Visual Studio (Namespaces usw.) umbenannt. Trotzdem trat die vom OP angegebene Ausnahme weiterhin auf. Ich fand heraus, dass die Assembly- und Namespace-Namen noch alt waren.
Obwohl das Projekt und alles andere wurde bereits genannt OfficeStyle das
Assembly name
undDefault namespace
waren immer noch genannt Linckus .Nach dieser Korrektur hat alles wieder gut funktioniert, kompilieren und laufen lassen :)
quelle
In meinem Fall haben diese hinzugefügten Codezeilen sehr
Web.config
geholfen:Zusammen mit Build action:
Embedded Resource
und Custom Tool :PublicResXFileCodeGenerator
.quelle
Doppelklicken Sie auf Eigenschaften im Abschnitt Anwendung. Überprüfen Sie, ob der Baugruppenname und der Standardnamespace identisch sind
quelle
Ich war auch mit dem gleichen Problem konfrontiert und habe alle in der Antwort genannten Lösungen ausprobiert, aber keine schien zu funktionieren. Es stellte sich heraus, dass beim Einchecken von Code in TFS. TFS hat die Resx-Datei nicht eingecheckt, sondern nur die Designer-Datei. Alle anderen Entwickler hatten dieses Problem, während sie auf ihren Computern ausgeführt wurden. Das manuelle Einchecken der resx-Datei hat den Trick getan
quelle
Dies kann auch auftreten, wenn eine Klasse über der Haupt-Winform-Klasse (z. B. Form1) platziert wird. Sie können dies sehen, wenn Sie sich das Design ansehen, da es nicht gerendert werden kann.
quelle
Noch eine andere Ursache: Wenn Ihr Namespace einen Bindestrich ("-") hat, wird er korrekt erstellt und ausgeführt, aber auf die Ressource kann nicht zugegriffen werden. Namespaces (Bezeichner) sollten keine Bindestriche enthalten, dies scheint jedoch nur beim Laden von Ressourcen erzwungen zu werden. Das hat mich im Laufe des Jahrzehnts zweimal verbrannt.
quelle
Sie müssen auch überprüfen, ob in der EmbeddedResource LogicalName oder ManifestResourceName definiert sind. Stellen Sie sicher, dass diese entsprechend definiert sind, wenn Ihre Projektdatei sie verwendet, da sie dazu führen können, dass die Ressourcen unter einem Namen leben, den Sie nicht erwarten.
quelle
Ich habe dieses Problem beim Ausführen des Migrationsbefehls festgestellt.
Update-Database
in der Package Manager-Konsole.Akzeptierte Antwort hat mein Problem nicht gelöst.
Ich musste Build Action ändern von
Compile
zuEmbedded Resource
und es funktionierte für mich.Sie können dasselbe mit den folgenden Schritten tun:
quelle
Für Benutzer, die mit diesem Problem in .NET Core 3.0 konfrontiert sind, kann dies mit einer in .NET Core 3.0 vorgenommenen Änderung zusammenhängen , um das Problem zu beheben, das
EmbeddedResourceUseDependentUponConvention
in Ihrem Projekt csproj auf false gesetzt ist:quelle
Klicken Sie mit der rechten Maustaste auf die Ressourcen und wählen Sie
Run Custom Tool
Dies wird den Designer reparieren
quelle
Nur weil Sie auf die DLL von Projekt B verweisen, bedeutet dies nicht, dass der Ressourcenmanager von Projekt A das App_GlobalResources-Verzeichnis von Projekt B kennt.
Verwenden Sie Website-Projekte oder Webanwendungsprojekte? In letzterem Fall sollte Visual Studio das Verknüpfen von Quellcodedateien ermöglichen (bei ersteren nicht sicher, ich habe sie nie verwendet). Dies ist eine wenig bekannte, aber nützliche Funktion, die hier beschrieben wird . Auf diese Weise können Sie die Ressourcendateien von Projekt B mit Projekt A verknüpfen.
quelle