Es konnten keine für die angegebene Kultur oder die neutrale Kultur geeigneten Ressourcen gefunden werden

194

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.

Entwickler
quelle
Um welche Art von Projekten handelt es sich? 2 Websites? 1 Website, 1 Klassenbibliothek?
Ruddy
Zwei ASP.NET-Website-Projekte.
dev.e.loper
11
+1 für das 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.
OmarOthman
1
+1 Ihre Fragendefinition mit dem Windows.Forms Project Microsoft-Hilfelink hat gerade mein Problem behoben.
DarrenMB
Diese Antwort hat das Problem für mich gelöst! GetGlobalResourceObject
DanielV

Antworten:

257

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.SupporttoProblemAssembly.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:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Support.Properties.Stuff", typeof(Stuff).Assembly);

gewesen sein sollte:

global::System.Resources.ResourceManager temp = 
     new global::System.Resources.ResourceManager(
          "ProblemAssembly.Controls.Properties.Stuff", typeof(Stuff).Assembly);

Hoffe das hilft der nächsten Person.

CFinck
quelle
5
+1 Gute Erklärung, wo die Ursache in der Designer-Datei zu finden ist. Dank dir das gleiche Problem gefunden und behoben :)
Gone Coding
1
Link: MSDN-Dokumentation für die ResourceManager- Klasse.
Boinst
3
Vielen Dank, es hat mir geholfen, dieses Problem zu lösen. Sie können auch die Designer-Datei löschen, dann öffnen und die Resx-Datei speichern, um die Designer-Datei korrekt neu zu generieren.
Serge
1
Ich hatte das gleiche Problem und dies war die Antwort, die ich suchte. Leider erscheint es nicht zur Kompilierungszeit :-( Danke
noob
2
danke hatte auch dieses Problem, aber es lag daran, dass ich einen Unterordner mit dem gleichen Namen wie der letzte Teil des Namespace des Projekts hinzugefügt habe, sodass nach project.folder.folder.class anstelle von project.folder.class gesucht wurde. Ich habe es zur Wurzel verschoben und jetzt richtet es sich aus und funktioniert!
SelAromDotNet
115

Ich habe das Problem folgendermaßen gelöst:

  1. Klicken Sie mit der rechten Maustaste auf Ihre ResourceFile
  2. Ändern Sie die Eigenschaft "Aktion erstellen" in "Eingebettete Ressource".
  3. Dann bauen und laufen

Es funktioniert perfekt.

Sibi Elango
quelle
@sibi Elango Ich klicke mit der rechten Maustaste auf meine ResourceFile, kann aber den Build Action-Teil nicht finden.
S5498658
1
@ S5498658 Wenn dies im Kontextmenü nicht angezeigt wird (Rechtsklick), sehen Sie im Eigenschaftenfenster nach (normalerweise unterhalb des Lösungs-Explorers).
definiert
Seine Build-Aktion funktioniert aber immer noch nicht. Außerdem habe ich überprüft, ob das Verzeichnis und das Verzeichnis unter Eigenschaften identisch sind.
Albatros
1
Es wäre großartig, wenn die Antwort erklären würde, warum diese Lösung funktioniert.
Luis Teijon
das ist einfach genial
code4j
22

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

  1. Löschen Sie die Properties/Resources.resxDatei des zweiten Projekts
  2. Fügen Sie die Properties/Resources.resxDatei des ersten Projekts als LINK zum Ordner Eigenschaften im zweiten Projekt hinzu. Fügen Sie es nicht zur Stammebene des Projekts hinzu.
  3. Fügen Sie nicht die ersten Projekte hinzu Properties/Resources.designer.cs!
  4. Auf die Eigenschaften des zweiten Projekts Resources.resx, fügen Sie ResXFileCodeGeneratorals Custom
  5. Klicken Sie mit der rechten Maustaste auf Resources.resxund 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.

Mark Lakata
quelle
12

In meinem Fall hatte eine Reihe von schlecht durchdachten globalen Textersetzungen diese Zeile in der CS-Datei des Ressourcendesigners versehentlich geändert.

Geben Sie hier die Bildbeschreibung ein

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.

Cockypup
quelle
1
war genau mein Problem. Danke für das Teilen!
AcidJunkie
Gleiches gilt hier: Nach der Migration von PCL zu .NET Standard habe ich ein temporäres Projekt und einen Namespace erstellt, in den ich alle portablen Dateien kopiert, das portable Projekt entfernt und den Namespace auf das Original zurückgesetzt habe. Diese Zeile enthielt immer noch den temporären Namespace aus dem Migrationsprozess.
Zerga
11

Dies geschieht, weil das *.resхvon der Migration ausgeschlossen ist.

  • Klicken Sie mit der rechten Maustaste auf Ihre ResourceFile
  • Klicken Sie auf den Menüpunkt "In Projekt einbeziehen".
user1919359
quelle
2
Das hat es für mich behoben. Normalerweise wird die resx-Datei automatisch hinzugefügt. Ich habe eine Zusammenführung durchgeführt, bei der ich die Projektdatei ändern und die Migrationen manuell hinzufügen musste. Vielleicht hatte das etwas damit zu tun
smarty
Hat für mich gearbeitet. Ich muss alle * .resx-Dateien jeder Migration hinzufügen. Danke
m.rufca
7

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

Stephen Drew
quelle
Das hat es für mich getan! (versuchte CFincks Antwort, da es relevant schien, aber es funktionierte nicht)
Winwaed
In der Tat eine der schnellsten Lösungen
Lorenz Lo Sauer
6

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(oder Friendin VB.Net). Stellen Sie sicher, dass Sie dies in ändernPublic

(Im Resx-Designer befindet sich oben ein Dropdown-Menü für den Zugriffsmodifikator.)

James S.
quelle
4

Die Antwort von Sibi Elangos allein reichte mir nicht aus, also musste ich

  • Klicken Sie mit der rechten Maustaste auf Ihre ResourceFile
  • Ändern Sie die Eigenschaft "Build Action"
  • Kompilieren Sie zu "Embedded Resource"
  • Erstellen und bereitstellen

Dies wird einen App_GlobalResources in Ihrem generieren /binOrdner, jetzt kopieren Sie diesen Ordner auch auf die Wurzel der Web - Anwendung

AlexanderD
quelle
4

In meinem Fall das Problem, das durch die falsche Definition der Klasse verursacht wurde:

namespace MyBuggyWorld
{
    public class BackendObject //This hack broke the VS 2017 winform designer and resources linker!
    {
        public TcpClient ActiveClient { get; set; }
        public BackgroundWorker ActiveWorker { get; set; }
    }
    public partial class FormMain : Form
    {
    }
}

Nach der Neuzuweisung BackendObjectbis zum Ende (besser zum Trennen der Datei) wurde das Problem durch Projektbereinigung + Neuerstellung behoben.

Jawad Al Shaikh
quelle
1
Wow, ich war mir nicht bewusst, dass die falsche Klasse am Anfang der Datei die Dinge so schlimm beschädigen würde.
BrainStorm.exe
4

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:

   <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

Jetzt sieht es so aus

  <ItemGroup>
    <EmbeddedResource Update="Properties\TextResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>MyProject.Properties.Resources.resources</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
Juansero29
quelle
3

Ü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ß ...;)

Mohammad Fazeli
quelle
1
Hallo, meinst du, dass der Standard-Namespace-Text (xxx) der gleiche sein sollte wie im Code: Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
DanielV
2

Ein Ansatz wäre, die gemeinsam genutzten Klassen / Ressourcen in ein separates Klassenbibliotheksprojekt zu stellen und auf beide Websites zu verweisen.

Subbu
quelle
2
Das ist doch das gleiche Problem, oder?
Brett Rigby
2

Danke @CFinck! Nur um anderen einen Tipp hinzuzufügen: Ich habe die ResourceManager-Zeile folgendermaßen geändert:

New Global.System.Resources.ResourceManager(Reflection.Assembly.GetCallingAssembly.GetName.Name & ".CommonNameOf.Resources", Reflection.Assembly.GetCallingAssembly())

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.

Mathieu Leblanc
quelle
1

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.

Trevor Elliott
quelle
1

Als wir benutzten

HttpContext.GetGlobalResourceObject()

Dieser Fehler würde generiert, wenn wir diesen Aufruf nicht in eine try / catch-Anweisung einschließen.

jmb_coder
quelle
1

Ich habe eine WinForms-Anwendung mit einem einzelnen Projekt in der Lösung.
Targeting .NET Framework 4.0
Verwenden SharpDevelop 4.3als meine IDE

Klingt albern, aber ich habe zufällig die Logical NameEigenschaft 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 das Logical Nameauf etwas Vernünftiges einstellen , aus irgendeinem Grund habe ich das gleiche für die Resources.resxDatei getan und das hat alles vermasselt ...

Hoffe das hilft jemandem.

Nurchi
quelle
Ich schien das auch zu haben. Ein Namenskonflikt, denke ich, guter Fund!
Trent
1

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:

MyResource.cs
|_ MyResource.resx

Während des kopierten Projekts waren die CS-Dateien von den RESX-Dateien abhängig:

MyResource.resx
|_ MyResource.cs

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.

Simon Tewsi
quelle
1

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

Petre
quelle
1
Willkommen bei Stackoverflow! Wenn Sie Code haben, den Sie uns mitteilen möchten, veröffentlichen Sie ihn bitte nicht als Bild. Sie können es Ihrem Beitrag hinzufügen und als Code formatieren .
FelixSFD
Vielen Dank an @FelixSFD für den Vorschlag
Petre
1

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

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

Nach dem Festlegen des Standard-Namespace über die GUI verursachte die obige Zeile keine Ausnahme mehr.

Poikilos
quelle
1

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 nameund Default namespacewaren immer noch genannt Linckus .

Alte Situation

Nach dieser Korrektur hat alles wieder gut funktioniert, kompilieren und laufen lassen :)

Neue Situation

Bernoulli IT
quelle
0

In meinem Fall haben diese hinzugefügten Codezeilen sehr Web.configgeholfen:

<system.web>
     ...
    <globalization uiCulture="cs" culture="cs-CZ" />
     ...
<system.web>

Zusammen mit Build action: Embedded Resourceund Custom Tool : PublicResXFileCodeGenerator.

m_david
quelle
0

Doppelklicken Sie auf Eigenschaften im Abschnitt Anwendung. Überprüfen Sie, ob der Baugruppenname und der Standardnamespace identisch sind

DevC
quelle
0

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

Kayani
quelle
Was meinst du mit "Einchecken"?
Fandango68
Pushing der Datei zu TFS
Kayani
0

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.

williamw
quelle
0

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.

beanmf
quelle
0

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.

David Engel
quelle
0

Ich habe dieses Problem beim Ausführen des Migrationsbefehls festgestellt. Update-Databasein der Package Manager-Konsole.

Akzeptierte Antwort hat mein Problem nicht gelöst.

Ich musste Build Action ändern von Compilezu Embedded Resourceund es funktionierte für mich.

Sie können dasselbe mit den folgenden Schritten tun:

  1. Klicken Sie mit der rechten Maustaste auf Migration.
  2. Ändern Sie die Eigenschaft "Build Action" "Compile" in "Embedded Resource".
  3. Führen Sie den Befehl Update-Database aus.
Immirza
quelle
0

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 EmbeddedResourceUseDependentUponConventionin Ihrem Projekt csproj auf false gesetzt ist:

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>
Soheil Alizadeh
quelle
0

Klicken Sie mit der rechten Maustaste auf die Ressourcen und wählen Sie Run Custom Tool

Dies wird den Designer reparieren

Michele Bortot
quelle
-1

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.

Heinzi
quelle