Cosa significa MissingManifestResourceException e come risolverlo?

La situazione:

  • Ho una libreria di classi, chiamata RT.Servers , contenente alcune risorse (di tipo byte[] , ma non penso che sia importante)
  • La stessa libreria di classi contiene un metodo che restituisce una di quelle risorse
  • Ho un semplice programma (con un riferimento a quella libreria) che chiama solo quel singolo metodo

Ottengo MissingManifestResourceException con il seguente messaggio:

Imansible trovare risorse appropriate per la cultura specificata o la cultura neutrale. Assicurati che “Servers.Resources.resources” sia stato correttamente incorporato o collegato nell’assembly “RT.Servers” in fase di compilazione, o che tutti gli assembly satellite richiesti siano caricabili e firmati completamente.

Non ho mai giocato con le culture, o con la firma delle assemblee, quindi non so cosa sta succedendo qui. Inoltre, questo funziona in un altro progetto che utilizza la stessa libreria. Qualche idea?

Tutto quello che dovevo fare per risolvere questo problema era fare clic con il pulsante destro del mouse sul file Resources.resx in Solution Explorer e fare clic su Esegui strumento personalizzato . Questo ricrea il file Resources.Designer.cs generato automaticamente.

Se il file .resx è stato aggiunto manualmente al progetto, la proprietà dello strumento personalizzato del file deve essere impostata su “ResXFileCodeGenerator”.

Il problema è dovuto a una mancata corrispondenza degli spazi dei nomi, che si verifica se si modifica lo “spazio dei nomi predefinito” dell’assieme nelle impostazioni del progetto. (L’ho cambiato da (in precedenza) "Servers" a (ora) "RT.Servers" .)

Nel codice generato automaticamente in Resources.Designer.cs , c’è il seguente codice:

 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 stringa letterale "Servers.Resources" doveva essere cambiata in "RT.Servers.Resources" . L’ho fatto manualmente, ma l’esecuzione dello strumento personalizzato lo avrebbe ugualmente ben fatto.

Mi sono imbattuto in questo problema oggi e ho trovato questa pagina di supporto e assistenza Microsoft che ha effettivamente risolto il problema.

Ho avuto un paio di delegati nella parte superiore del mio file, nello spazio dei nomi globale, e all’improvviso ho ricevuto MissingManifestResourceException durante l’esecuzione del programma, su questa riga:

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

Poi ho spostato i delegati nello spazio dei nomi, ho ottenuto lo stesso errore. Alla fine ho messo i delegati nell’unica class in quel file, e l’errore è andato via, ma non volevo i delegati in quella class o spazio dei nomi.

Poi mi sono imbattuto in quel link sopra, che diceva

Per risolvere questo problema, spostare tutte le altre definizioni di class in modo che vengano visualizzate dopo la definizione della class del modulo.

Metto i delegati (che non considererei “definizioni di class”) nella parte inferiore di quel file, al di fuori dello spazio dei nomi locale, e il programma non ha più ottenuto MissingManifestResourceException . Che errore irritante. Ma sembra una soluzione più robusta rispetto alla modifica del codice generato automaticamente 🙂

Mi sono imbattuto in un problema simile e, anche se so che non è la causa dell’OP, lo posterò qui in modo che se qualcun altro si imbatte in questo problema in futuro, sarà disponibile una risposta.

Se si aggiunge una class prima della class designer, si otterrà un’eccezione MissingManifestResourceException in fase di runtime (nessun errore di compilazione o avviso) perché

Visual Studio richiede che i progettisti utilizzino la prima class nel file.

Per (leggermente) maggiori informazioni vedi questo post .

Ho avuto lo stesso problema, ma l’utilizzo del comando Esegui strumento personalizzato come suggerito da Timwi non ha aiutato nel mio caso.

Tuttavia mi ha portato nella giusta direzione, perché sono finito nelle proprietà del file .resx . Qui ho notato una differenza con un altro file .resx che non ha causato problemi.

Nel mio caso ho dovuto modificare la proprietà “Build Action” da “Resource” a “Embedded Resource”.

La mia ipotesi migliore per la ragione è che ho avuto il .resx in una libreria che è stata utilizzata da un’altra applicazione. La mia applicazione non aveva il proprio file .resx , quindi ha dovuto usare quello della libreria – che è disponibile solo quando è incorporato nella libreria e non “stand alone”.

Quando ho eseguito un problema simile, in Vs 2012, si è scoperto che la proprietà “Custom Tool Namespace” del file resx era errata (nel mio caso, in realtà, non era impostata, quindi il codice generato esclude questa eccezione in fase di runtime) . Il mio ultimo set di proprietà per il file resx era qualcosa del genere:

  • Azione di compilazione : risorsa incorporata
  • Copia nella directory di output: non copiare
  • Strumento personalizzato: ResXFileCodeGenerator
  • Spazio dei nomi degli strumenti personalizzati: My.Project.S.Proper.Namespace

Mi sono imbattuto in una causa diversa di questo problema, che non era correlato ai file resx. Ho avuto una libreria di classi in cui AssemblyInfo.cs conteneva quanto segue:

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

L’assembly non conteneva alcun codice WPF, tema o dizionari di risorse. Ho eliminato l’eccezione rimuovendo l’attributo ThemeInfo.

Non ho ricevuto una vera eccezione, solo

Una prima eccezione di tipo “System.Resources.MissingManifestResourceException”.

Visualizzando i dettagli delle eccezioni, il sistema stava richiedendo MyAssembly.g.resources

Spero che questo possa essere di aiuto a qualcun altro.

Non sono sicuro che aiuterà le persone, ma questo ha funzionato per me:

Quindi il problema che ho avuto è stato che ricevevo il seguente messaggio:

Imansible trovare risorse appropriate per la cultura specificata o la cultura neutrale. Assicurati che “My.Resources.Resources.resources” sia stato correttamente incorporato o collegato nell’assembly “X” in fase di compilazione o che tutti gli assembly satellite richiesti siano caricabili e firmati ”

Stavo cercando di ottenere le risorse che erano incorporate nel mio progetto da un’altra libreria di classi.

Quello che ho fatto per risolvere il problema è stato impostare Access Modifier nella scheda Progetto-> Proprietà-> Risorse da “Interno” (accessibile solo all’interno della stessa libreria di classi) a “Pubblico” (accessibile da un’altra libreria di classi)

Quindi corri e voilà, non c’è più errore per me …

Vedi anche: MissingManifestResourceException durante l’esecuzione di test dopo la creazione con MSBuild (.mresource ha path in manifest)

Ripeto la risposta qui solo per completezza:

Sembra che l’aggiunta di LogicalName al file di progetto la risolva:

 $(RootNamespace).Properties.Resources.resources 

cioè così la voce della risorsa incorporata nel file di progetto è simile a questa:

   ResXFileCodeGenerator Resources.Designer.cs $(RootNamespace).Properties.Resources.resources   

Questo è dettagliato in: http://blogs.msdn.com/b/msbuild/archive/2007/10/19/manifest-resource-names-changed-for-resources-files.aspx

Si noti che stiamo utilizzando un file .resx, ma il bug sembra ancora verificarsi.

Aggiornamento: Il problema con le risorse (incluso XAML) sembra essere correlato ai percorsi di output e all’uso delle barre in avanti o indietro come descritto in: Perché la modifica delle directory di output del progetto causa: IOException non gestito “Imansible localizzare la risorsa” app.xaml ” “.

La soluzione fornita da BlaM ha funzionato anche per me.

Sono un utente di VS 2013. Dopo aver superato molte correzioni ma senza fortuna, ho provato questo:

  1. Fare clic con il tasto destro del mouse sul file di risorse, uno alla volta, in caso di file multipli.
  2. Assicurarsi che la proprietà “Build Action” sia impostata su “Embedded Resource”.

Questo è tutto! 🙂

Ho avuto lo stesso problema, ma nel mio caso inserisco una class in un controllo utente che è correlato all’usercontrol come questo

 Public Class MyUserControlObject end Class Public Class MyUserCOntrol end Class 

La soluzione era spostare MyUserControlObject alla fine della class Usercontrol, in questo modo

 Public Class MyUserCOntrol end Class Public Class MyUserControlObject end Class 

Spero che aiuti

Stavo ricevendo l’errore MissingManifestResourceException dopo che ho portato il mio progetto da VS2005 a VS2010. Non ho definito altre classi nel file che contiene la mia class Form. E ho anche avuto il mio Resx File Name Nome impostato correttamente. Non ha funzionato

Così ho cancellato i file resx e li ho rigenerati. Tutto bene ora.

Recentemente ho avuto lo stesso problema, ho faticato un po ‘, ho trovato questo argomento ma nessuna risposta era corretta per me.

Il mio problema era che quando ho rimosso la finestra principale dal mio progetto WPF (non ha una finestra principale), ho dimenticato di rimuovere StartupUri da StartupUri . Immagino che questa eccezione possa accadere se hai un errore in StartupUri , quindi nel caso in cui qualcuno stia lottando con questo – controlla il tuo StartupUri in StartupUri .

Perché sto pre-compilando la mia applicazione web (usando la funzione di pubblicazione VS2012). Stavo ricevendo l’errore sopra. Ho provato tutti i suggerimenti, ma modificare “Build Action” in “Content” ha fatto il trucco!

Nel mio caso, ho una API Web con risorse e creo un pacchetto nuget da questo. Quando uso questo nuget in altri progetti, mi rendo conto che quando richiedo un’api con risorse, ottengo MissingManifestResourceException dopo un po ‘di ricerca, imparo che nuget packager non sta impacchettando le risorse automaticamente. Se si desidera utilizzare i file di risorse, è necessario farlo manualmente. Quindi è necessario aggiungere sotto le righe al file .nuspec: (Visitare https://github.com/NuGet/Home/issues/1482 )

         

Ma, prima di aggiungere file, devi essere sicuro di quale versione di .net stai usando.

Recentemente sono incappato in questo problema, nel mio caso ho fatto alcune cose:

  1. Assicurarsi che gli spazi dei nomi siano coerenti nel file Designer.cs del file resx

  2. Assicurati che lo spazio dei nomi predefinito dell’Assembly (fai clic con il pulsante destro del mouse sul progetto e scegli Proprietà) sia impostato sullo spazio dei nomi in cui si trova il file delle risorse.

Una volta che ho fatto il passaggio 2, l’eccezione è andata via.

Ho avuto il nuovo progetto F #. La soluzione era deselezionare “Utilizza nomi di risorse standard” nelle proprietà del progetto -> Applicazione -> Risorse / Specificare come verranno gestite le risorse dell’applicazione. Se non vedi la casella, aggiorna Visual Studio! Ho installato il 15.6.7. In 15.3.2 questa casella di controllo non è presente.

Dalla pagina di supporto Microsoft :

Questo problema si verifica se si utilizza una risorsa localizzata esistente in un assembly satellite che è stato creato utilizzando un file .resources con un nome file non appropriato. Questo problema si verifica in genere se si crea manualmente un assembly satellite.

Per aggirare questo problema, specificare il nome di file del file .resources quando si esegue Resgen.exe. Mentre si specifica il nome del file .resources, assicurarsi che il nome del file inizi con il nome dello spazio dei nomi dell’applicazione. Ad esempio, eseguire il comando seguente al prompt dei comandi di Microsoft Visual Studio .NET per creare un file .resources con il nome dello spazio dei nomi dell’applicazione all’inizio del nome del file:

 Resgen strings.CultureIdentifier.resx MyApp.strings.CultureIdentifier.resources