Impossibile trovare risorse appropriate per la cultura specificata o per la cultura neutrale


194

Ho due progetti Web ASP.NET (ProjectA e ProjectB). Quando la classe in ProjectA crea un'istanza di una classe di ProjectB che utilizza un file di risorse Blah.resx, ottengo questo errore:

Si è verificata un'eccezione di tipo "System.Resources.MissingManifestResourceException" in mscorlib.dll ma non è stata gestita nel codice utente.

Impossibile trovare risorse appropriate per la cultura specificata o per la cultura neutrale. Accertarsi che "Resources.Blah.resources" sia stato correttamente incorporato o collegato nell'assembly "App_GlobalResources.sn_flri6" al momento della compilazione o che tutti gli assembly satellite richiesti siano caricabili e completamente firmati.

Cosa sta causando questo?

C'è un articolo sul sito di Microsoft su questo http://support.microsoft.com/kb/318603 che suggerisce:

Per risolvere questo problema, spostare tutte le altre definizioni di classe in modo che appaiano dopo la definizione di classe del modulo.

Questa è una soluzione per il progetto Windows Form, non sono sicuro che si applichi anche ai progetti Web.


Che tipo di progetti sono questi? 2 siti web? 1 sito web, 1 biblioteca di classe?
Ruddy,

Due progetti di siti Web ASP.NET.
dev.e.loper il

11
+1 per il To resolve this problem, move all of the other class definitions so that they appear after the form's class definition.Questo ha risolto il mio problema.
OmarOthman,

1
Fai +1 sulla definizione delle tue domande con il link Aiuto di Microsoft Project.Forms Project appena risolto il mio problema.
DarrenMB,

Questa risposta ha risolto il problema per me! GetGlobalResourceObject
DanielV,

Risposte:


257

Ho appena raggiunto la stessa eccezione in un progetto WPF. Il problema si è verificato all'interno di un assembly che è stato recentemente spostato in un altro spazio dei nomi ( ProblemAssembly.Supportin ProblemAssembly.Controls). Si è verificata un'eccezione durante il tentativo di accedere alle risorse da un secondo file di risorse presente nell'assembly.

Risulta che il file di risorse aggiuntivo non ha spostato correttamente i riferimenti dal vecchio nome dello spazio dei nomi al nuovo nome dello spazio dei nomi.

In designer.cs per il file di risorse, esiste una proprietà statica per ottenere ResourceManager. All'interno di quel getter, la stringa faceva ancora riferimento al vecchio spazio dei nomi. Una volta corretto il nuovo spazio dei nomi, il problema è stato risolto:

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

avrebbe dovuto essere:

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

Spero che questo aiuti la prossima persona.


5
+1 Buona spiegazione di dove individuare la causa nel file di progettazione. Trovato e risolto lo stesso problema grazie a te :)
Codice andato

1
collegamento: documentazione MSDN per la classe ResourceManager .
Boinst,

3
Grazie mi ha aiutato a risolvere questo problema. Si può anche eliminare il file designer, quindi aprire quindi salvare il file resx per rigenerare correttamente il file designer.
Serge,

1
Ho avuto lo stesso problema e questa era la risposta che stavo cercando. Purtroppo non appare al momento della compilazione :-( Grazie
noob

2
grazie ho avuto anche questo problema, ma è stato perché ho aggiunto una sottocartella con lo stesso nome dell'ultima parte dello spazio dei nomi del progetto, quindi stava cercando project.folder.folder.class invece di project.folder.class. L'ho spostato sulla radice e ora si allinea e funziona!
SelAromDotNet,

115

Ho risolto il problema in questo modo:

  1. Fare clic con il tasto destro sul file delle risorse
  2. Modifica la proprietà "Build Action" Compila in "Embedded Resource"
  3. Quindi compilare ed eseguire

Funziona perfettamente.


@sibi Elango Faccio clic con il pulsante destro del mouse sul mio File di risorse ma non riesco a trovare la parte Azione di costruzione.
S5498658,

1
@ S5498658 Se non lo vedi nel menu di scelta rapida (clic con il pulsante destro del mouse), cerca nel pannello Proprietà (in genere situato sotto Esplora soluzioni).
definisce il

La sua azione di costruzione ma non funziona ancora. Inoltre ho controllato la directory e la directory è la stessa sotto le proprietà.
albatro

1
Sarebbe bello se la risposta spiegasse perché questa soluzione funziona.
Luis Teijon,

è semplicemente fantastico
code4j,

22

Quando ho provato a condividere un file resource.resx da un progetto C # con un altro progetto C #, ho riscontrato questo problema. Il suggerimento su come spostare la classe Form all'inizio del suo file non era appropriato. Ecco come l'ho risolto. In pratica si utilizza un collegamento dal secondo progetto al primo, quindi si abilita la rigenerazione del resource.designer.csfile.

  1. Elimina il secondo progetto Properties/Resources.resx file
  2. Aggiungi il Properties/Resources.resxfile del primo progetto come LINK alla cartella Proprietà nel secondo progetto. Non aggiungerlo al livello principale del progetto.
  3. Non aggiungere i primi progetti Properties/Resources.designer.cs!
  4. Sulle proprietà del secondo progetto Resources.resx, aggiungere ResXFileCodeGeneratorcome CustomTool
  5. Fare clic destro su Resources.resxe selezionare "Esegui strumento personalizzato". Ciò genererà un nuovo file designer.cs.

Nota: eviterei di modificare il file resource.designer.cs, poiché questo è generato automaticamente.


12

Nel mio caso una serie di sostituzioni di testo globali pensate male hanno inavvertitamente cambiato questa riga nel file cs del progettista delle risorse.

inserisci qui la descrizione dell'immagine

Poiché lo spazio dei nomi in quell'argomento non corrispondeva più allo spazio dei nomi della classe, l'applicazione è stata confusa in fase di esecuzione.

Verificare che lo spazio dei nomi del designer corrisponda all'argomento stringa in quella riga.


1
era esattamente il mio problema. Grazie per la condivisione!
AcidJunkie,

Lo stesso qui: è successo dopo la migrazione da PCL a .NET Standard, quando ho creato un progetto temporaneo e uno spazio dei nomi, in cui ho copiato tutti i file portatili, rimosso il progetto portatile e ripristinato lo spazio dei nomi all'originale, questa riga conteneva ancora il temporaneo spazio dei nomi dal processo di migrazione.
Zerga,

11

Succede perché *.resхè escluso dalla migrazione.

  • Fare clic con il tasto destro sul file delle risorse
  • Fare clic sulla voce di menu "Includi nel progetto"

2
Questo mi ha risolto. Normalmente il file resx viene aggiunto automaticamente. Ho fatto una fusione in cui ho dovuto modificare il file di progetto e aggiungere manualmente le migrazioni, quindi forse questo aveva a che fare con esso
smarty,

Ha funzionato per me. Devo aggiungere tutti i file * .resx di ogni migrazione. Grazie
m.rufca,

7

Ho scoperto che l'eliminazione del file designer.cs, escludendo il file resx dal progetto e quindi includendolo spesso risolveva questo tipo di problema, seguendo un refactoring dello spazio dei nomi (come da risposta di CFinck)


Questo è quello che ha fatto per me! (ha provato la risposta di CFinck perché sembrava pertinente, ma non ha funzionato)
vinto l'

In effetti una delle soluzioni più veloci
Lorenz Lo Sauer,

6

Nessuno sembra aver menzionato questa soluzione. Ovvio davvero - ma mi ha inciampato per un momento ...

Il modificatore di accesso predefinito per un nuovo file di risorse è Internal(o Friendin VB.Net.) Assicurati di cambiarlo inPublic

(nel designer resx c'è un menu a discesa in alto per il modificatore di accesso)


4

La risposta di Sibi Elangos da sola non era sufficiente per me, quindi ho dovuto

  • Fare clic con il tasto destro sul file delle risorse
  • Modifica la proprietà "Build Action"
  • Compilare in "Risorsa integrata"
  • Compilare e distribuire

Questo genererà un App_GlobalResources nella tua /bincartella, ora copia quella cartella anche nella radice dell'applicazione web


4

Nel mio caso, il problema causato dalla definizione della classe nel modo sbagliato:

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

Dopo la riallocazione BackendObjectfino alla fine (meglio separare il file), facendo progetto pulito + ricostruisci risolto il problema.


1
Wow, non sapevo che avere la classe sbagliata all'inizio del file avrebbe rotto le cose così male.
BrainStorm.exe,

4

Ho risolto questo andando al progetto in cui è stato salvato il mio file di risorse, scorrendo verso il basso fino al gruppo di elementi e aggiungendo un nome logico corrispondente al percorso previsto dal compilatore.

Il mio EmbeddedResource assomigliava a questo:

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

Ora sembra così

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

3

Per quanto riguarda questo caso, controlla se l'assembly contenente risorse ha lo spazio dei nomi predefinito impostato sullo stesso testo (Progetto-> Proprietà-> Spazio dei nomi predefinito; in VS) Controlla anche se il file resx ha una proprietà BuildAction impostata su "Embedded risorsa "Divertiti ...;)


1
Ciao, vuoi dire che il testo dello spazio dei nomi predefinito (xxx) dovrebbe essere lo stesso del codice: Assembly localisationAssembly = Assembly.Load("xxx"); ResourceManager resourceManager = new ResourceManager("xxx", localisationAssembly);
DanielV

2

Un approccio sarebbe quello di mettere le classi / risorse condivise in un progetto di libreria di classi separato e farle riferimento in entrambi i siti web.


2
Sicuramente questo è lo stesso problema, vero?
Brett Rigby,

2

Grazie @CFinck! Solo per aggiungere un suggerimento ad altri: ho modificato la riga ResourceManager con questo:

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

Sono su vb.net ma penso che in C # l'unica differenza sarebbe + invece di & per concatenare le stringhe.

In questo modo posso usare gli stessi file assembly collegati in due progetti simili che condividono le risorse.


1

Questo errore viene inoltre generato da Dotfuscation, poiché un file di progettazione resx si basa sulla riflessione. Se si utilizza Dotfuscator, i file resx verranno interrotti. Devi sempre aggiungerli come esclusione dal processo di offuscamento.


1

Quando stavamo usando

HttpContext.GetGlobalResourceObject()

Genererebbe quell'errore se non avessimo racchiuso quella chiamata in un'istruzione try / catch.


1

Ho un'applicazione WinForms con un singolo progetto nella soluzione.
Targeting .NET Framework 4.0
Utilizzando SharpDevelop 4.3come mio IDE

Sembra sciocco, ma mi è capitato di avere la Logical Nameproprietà impostata "Resources"sul mio "Resources.resx"file. Una volta che ho cancellato quella proprietà, tutto funziona hunky-dory.

Normalmente, quando aggiungi file casuali come EmbeddedResource, generalmente vuoi impostare Logical Namequalcosa su ragionevole, per qualche ragione, ho fatto lo stesso sul Resources.resxfile e questo ha rovinato tutto ...

Spero che questo aiuti qualcuno.


Mi è sembrato di avere anche questo. Un conflitto di nomi credo, buona scoperta!
Trento,

1

Per me il problema era copiare i file .resx e i file .cs associati da un progetto a un altro. Entrambi i progetti avevano lo stesso spazio dei nomi, quindi non era questo il problema.

Alla fine l'ho risolto quando ho notato in Solution Explorer che nel progetto originale i file .resx dipendevano dai file .cs:

MyResource.cs
|_ MyResource.resx

Mentre nel progetto copiato i file .cs dipendevano dai file .resx:

MyResource.resx
|_ MyResource.cs

Si è scoperto che nel secondo progetto in qualche modo i file .resx erano stati impostati per generare automaticamente i file .cs. I file .cs generati automaticamente stavano sovrascrivendo i file .cs copiati dal progetto originale.

Per risolvere il problema, modifica le proprietà di ciascun file .resx nel progetto copiato. La proprietà dello strumento personalizzato verrà impostata su qualcosa come ResXFileCodeGenerator . Cancella la proprietà dello strumento personalizzato del file .resx. Sarà necessario copiare nuovamente il file .cs dal progetto originale poiché sarà stato sovrascritto dal file generato automaticamente.


1

Nel mio caso avevo inserito una nuova classe in cima a un modulo di Windows, all'interno dello stesso file.

Lo spostamento della classe appena aggiunta da quel file ha risolto il problema.

Vedi qui: http://i.stack.imgur.com/wVu6c.png


1
Benvenuto su Stackoverflow! Se hai un codice da condividere con noi, ti preghiamo di non pubblicarlo come immagine. Puoi aggiungerlo al tuo post e formattarlo come codice .
FelixSFD

Grazie @FelixSFD per il suggerimento
Petre,

1

Ciò può essere causato da spazi dei nomi non corrispondenti. La seconda risposta (Sibi Elango) dice di fare clic con il pulsante destro del mouse sul file resx e cambiare l'opzione Build in EmbeddedResource, ma l'avevo già fatto e avevo ancora l'errore. La risposta principale (CFinck's) rileva un modo per risolvere questo problema tramite la modifica manuale dei file, tuttavia, ho riscontrato questo problema in MonoDevelop e ho dovuto impostare lo spazio dei nomi predefinito sullo stesso file cs che richiedeva la risorsa (il file che codice contenuto come il codice seguente) ...

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

Dopo aver impostato lo spazio dei nomi predefinito tramite la GUI, la riga sopra non ha più causato un'eccezione.


1

Solo un altro caso. Ho copiato una soluzione con due progetti e li ho rinominati parzialmente in Esplora risorse di Windows (nomi delle cartelle, nomi dei file .sln e .csproj) e parzialmente con una massiccia azione Trova e sostituisci in Visual Studio (spazi dei nomi, ecc.). Tuttavia, si è ancora verificata l'eccezione dichiarata dal PO. Ho scoperto che i nomi di Assembly e Namespace erano ancora vecchi.

Anche se il progetto e tutto il resto era già nominato OfficeStyle la Assembly namee Default namespacesono stati ancora nominati Linckus .

Vecchia situazione

Dopo questa correzione tutto ha funzionato di nuovo bene, compilare e runtime :)

Nuova situazione


1

Per gli utenti che si trovano ad affrontare questo problema in .NET Core 3.0, ciò potrebbe essere correlato a una modifica sostanziale apportata in .NET Core 3.0, per risolverlo è sufficiente impostare EmbeddedResourceUseDependentUponConventionsu false nel progetto csproj:

<PropertyGroup>
  <EmbeddedResourceUseDependentUponConvention>false</EmbeddedResourceUseDependentUponConvention>
</PropertyGroup>

0

Nel mio caso queste righe di codice aggiunte hanno Web.configaiutato molto:

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

Insieme con l'azione Corporatura: Embedded Resourcee strumento personalizzato: PublicResXFileCodeGenerator.


0

Fare doppio clic sulle proprietà nella sezione Applicazione controllo Il nome dell'assieme e lo spazio dei nomi predefinito sono gli stessi


0

Stavo anche affrontando lo stesso problema, ho provato tutte le soluzioni menzionate nella risposta, ma nessuna sembrava funzionare. Si è scoperto che durante il check-in del codice su TFS. TFS non ha effettuato il checkin nel file Resx, ma solo nel file designer. Quindi, tutti gli altri sviluppatori stavano affrontando questo problema mentre erano in esecuzione sui loro computer. Il controllo nel file resx ha fatto manualmente il trucco


Cosa intendi con "check-in"?
Fandango68,

Invio del file a TFS
Kayani,

0

Questo può accadere anche quando si mette una classe al di sopra della classe principale di winform (Form1, ad esempio). Si può vedere questo quando si guarda il progetto, poiché non viene visualizzato.


0

Ancora un'altra causa: se il tuo spazio dei nomi ha un trattino ("-"), allora verrà compilato ed eseguito correttamente, ma la risorsa non sarà accessibile. Gli spazi dei nomi (identificatori) non dovrebbero avere trattini, ma questo non sembra essere applicato da nessuna parte tranne che nel caricamento delle risorse. Questo mi ha bruciato due volte nel corso del decennio.


0

Un'altra cosa da verificare è se LogicalNesource è stato definito LogicalName o ManifestResourceName. Assicurati che siano definiti in modo appropriato se il tuo file di progetto li sta usando in quanto possono far sì che le risorse vivano con un nome che non ti aspetti.


0

Ho riscontrato questo problema per l'esecuzione del comando Migration. Update-Databasenella console di Package Manager.

La risposta accettata non ha risolto il mio problema.

Ho dovuto cambiare Build Action da Compilea Embedded Resourcee ha funzionato per me.

Puoi fare lo stesso usando i passaggi seguenti:

  1. Fare clic con il tasto destro sulla migrazione.
  2. Modifica la proprietà "Compila azione" "Compila" in "Risorsa integrata"
  3. Esegui il comando Update-Database.

0

Fare clic con il tasto destro del mouse sulle risorse e selezionare Run Custom Tool

Questo risolverà il progettista


-1

Solo perché si fa riferimento alla DLL del progetto B non significa che il gestore risorse del progetto A sia a conoscenza della directory App_GlobalResources del progetto B.

Utilizzi progetti di siti Web o progetti di applicazioni Web? In quest'ultimo caso, Visual Studio dovrebbe consentire di collegare file di codice sorgente (non sono sicuro del primo, non li ho mai usati). Questa è una funzione poco conosciuta ma utile, che è descritta qui . In questo modo, è possibile collegare i file di risorse del Progetto B nel Progetto A.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.