Che cosa significa MissingManifestResourceException e come risolverlo?


151

La situazione:

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

Ottengo a MissingManifestResourceExceptioncon il seguente messaggio:

Impossibile trovare risorse appropriate per la cultura specificata o per la cultura neutrale. Assicurarsi che "Servers.Resources.resources" sia stato correttamente incorporato o collegato all'assembly "RT.Servers" al momento della compilazione o che tutti gli assembly satellite richiesti siano caricabili e firmati.

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


2
Questa è una delle eccezioni più inutili in .NET. Si innesca in almeno 3 scenari che non condividono nulla in comune.
RR-

1
Siamo spiacenti, ma è un modo Microsoft: rimuovi tutto, quindi aggiungi di nuovo . Funziona con risorse, NUGET, riferimenti e stringhe di connessione. Ci sono molti strumenti, ma
passerai del

Risposte:


238

Tutto ciò che dovevo fare per risolvere questo problema era fare clic con il pulsante destro del mouse sul Resources.resxfile in Esplora soluzioni e fare clic su Esegui strumento personalizzato . Ciò genera nuovamente il Resources.Designer.csfile generato automaticamente .

Se il file .resx è stato aggiunto manualmente al progetto, la proprietà 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'assembly 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 l'avrebbe fatto altrettanto bene.


9
Questo mi ha fatto risparmiare un sacco di tempo!
Eric,

1
+1! In VS 2010 la stringa letterale di ResourceManager mostrata sopra viene automaticamente aggiornata al valore dello spazio dei nomi predefinito nelle proprietà del progetto (scheda Applicazione), almeno per WinForms.
TrueWill,

2
Cosa succede se non si dispone di un file resources.resx?
ashes999,

@ ashes999: hai cercato nella cartella Proprietà? Questo è dove di solito è per i progetti C # almeno.
RenniePet

ho riscontrato lo stesso problema. Il file .resx è stato aggiunto manualmente al progetto, la proprietà dello strumento personalizzato del file che ho impostato su "ResXFileCodeGenerator" .quindi il file resx è prima e successivamente il file designer.vb in seguito. Il file Desinger è il primo e più tardi .resx file. come posso farcela ....
Kavitha il

37

Oggi ho riscontrato questo problema e ho trovato questa pagina Guida e supporto tecnico Microsoft che ha effettivamente risolto il problema.

Avevo un paio di delegati nella parte superiore del mio file, nello spazio dei nomi globale, e all'improvviso stavo ottenendo un MissingManifestResourceExceptiondurante l'esecuzione del programma, su questa linea:

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

Quindi ho spostato i delegati nello spazio dei nomi, ho ottenuto lo stesso errore. Alla fine ho inserito i delegati nell'unica classe in quel file e l'errore è scomparso, ma non volevo i delegati in quella classe o spazio dei nomi.

Poi ho trovato quel link sopra, che diceva

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

Ho messo i delegati (che non considererei "definizioni di classe") in fondo a quel file, al di fuori dello spazio dei nomi locale, e il programma non ha più ottenuto MissingManifestResourceException. Che errore irritante. Ma quella sembra una soluzione più solida della modifica del codice generato automaticamente :)


Grazie per la tua risposta. Sembra che tu abbia avuto un problema diverso che ha causato lo stesso sintomo. Non avevo classi extra nel mio codice, anzi non avevo nemmeno alcun modulo. Dovrei modificare la mia risposta precedente perché ho scoperto che in realtà non avevo bisogno di modificare il codice generato automaticamente. Avrei potuto rieseguire il generatore di codice e si sarebbe risolto da solo. Non ho idea del perché il processo di compilazione non sia stato eseguito automaticamente.
Timwi,

7
Ho ricevuto l'errore a causa dell'aggiunta di una classe sopra la classe del modulo nel file Form1.cs (come discusso nella sezione "Risoluzione" del collegamento fornito). Grazie!
Matt Smith,

Stesso problema; nient'altro funzionava, quindi ho semplicemente cancellato la riga: this.Icon = ((System.Drawing.Icon) (resources.GetObject ("$ this.Icon"))); perché non mi interessa l'icona in quella particolare forma :)
Gary Huckabone,

Questa è la risposta Grazie.
Sertan Pekel,

Se qualcuno confuso avevo una classe chiamata "StringExtensions" prima del bit "Form1" di Form1.cs, l'ho spostato sotto Form1 in form1.cs invece che sopra e ha funzionato
Ma Dude,

31

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

Se aggiungi una classe prima della classe designer otterrai MissingManifestResourceExceptionun'eccezione in fase di runtime (nessun errore di compilazione o avviso) perché

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

Per (leggermente) maggiori informazioni vedi questo post .


12
Grazie per aver pubblicato questa "risposta". Nonostante sia "fuori tema" rispetto al problema del PO, è stata una buona idea pubblicarlo qui. Una ricerca di MissingManifestResourceException mi ha portato a questo thread e la tua risposta è stata perfetta per il mio problema.
RenniePet,

16

Ho avuto lo stesso problema, ma l'utilizzo del comando Esegui strumento personalizzato come suggerito da Timwi non mi 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 il motivo è che avevo il .resx in una libreria che è stata utilizzata da un'altra applicazione. La mia applicazione non aveva un proprio file .resx , quindi doveva usare quello della libreria - che è disponibile solo quando è incorporato nella libreria e non "autonomo".


2
+1 grazie, ho ricontrollato i miei file di risorse che si trovano anche in una libreria separata a cui fanno riferimento altre applicazioni. Avevo Build Action impostato su Content, e dopo averlo modificato in Embedded Resource, tutto ha funzionato bene. Sorveglianza sciocca
Shan Plourde,

1
Grazie! Questo ha funzionato per me in cui avevo alcuni file di testo contenenti contenuti per i test o alcune regole di mappatura aziendale. Il passaggio dal contenuto alla risorsa integrata ha risolto il problema.
S. Baggy,

12

Quando ho riscontrato un problema simile, in Vs 2012, si è scoperto che la proprietà "Spazio dei nomi degli strumenti personalizzati" del file resx era errata (nel mio caso, in realtà, non era impostata, quindi il codice generato ha respinto questa eccezione in fase di runtime) . Il mio set finale di proprietà per il file resx era qualcosa del genere:

  • Costruisci azione: risorsa integrata
  • Copia nella directory di output: non copiare
  • Strumento personalizzato: ResXFileCodeGenerator
  • Spazio dei nomi dello strumento personalizzato: My.Project.S.Proper.Namespace

3

Vedi anche: MissingManifestResourceException durante l'esecuzione di test dopo la compilazione con MSBuild (.mresource ha percorso in manifest)

Ripeto la risposta qui solo per completezza:

Sembra che l'aggiunta di LogicalName al file di progetto lo risolva:

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

vale a dire quindi la voce di risorsa incorporata nel file di progetto è simile alla seguente:

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

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 di barre rovesciate o all'indietro come descritto in: Perché la modifica delle directory di output del progetto causa: IOException non è stata gestita "Impossibile individuare la risorsa 'app.xaml' ".


Dopo circa otto ore di debug di questo problema e letteralmente sfogliare tutte le risposte di github, SO e Google, questa è la risposta che ha risolto il mio problema ... prima, il mio problema ha iniziato a verificarsi dopo la migrazione da .Net 3.5 a 4.7.2.
Neville,

3

Ho riscontrato una causa diversa di questo problema, che non era correlata ai file resx. Avevo 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. Mi sono sbarazzato dell'eccezione rimuovendo l'attributo ThemeInfo.

Non ho ricevuto una vera eccezione, solo

Un'eccezione della prima possibilità del tipo "System.Resources.MissingManifestResourceException".

Visualizzando i dettagli delle eccezioni, il sistema richiedeva risorse MyAssembly.g.

Spero che questo possa essere d'aiuto a qualcun altro.


2
Grazie per questo! Esattamente la correzione di cui avevo bisogno! Succede quando si crea accidentalmente un progetto ViewModel come libreria di controllo.
Andrew Hanlon,

Grazie. Questo mi ha risolto.
Jamleck,

2

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

Quindi il problema che avevo era che stavo ricevendo il seguente messaggio:

Impossibile trovare risorse appropriate per la cultura specificata o per la cultura neutrale. Assicurarsi che "My.Resources.Resources.resources" sia stato correttamente incorporato o collegato all'assembly "X" al momento della compilazione o che tutti gli assembly satellite richiesti siano caricabili e firmati in modo completo "

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

Quello che ho fatto per risolvere il problema è stato impostare il modificatore di accesso 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à, niente più errori per me ...


2

La soluzione fornita da BlaM ha funzionato anche per me.

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

  1. Fare clic con il tasto destro del mouse sul file di risorse, uno a uno, in caso di più file.
  2. Assicurati che la proprietà "Build Action" sia impostata su "Embedded Resource".

Questo è tutto! :)


Confermando questo. Ho un progetto funzionante ma avevo bisogno di mantenere gli assemblaggi delle risorse separatamente, quindi ho provato a passare da "Risorsa incorporata" a "Risorsa" e alla fine ho ottenuto MissingResourceManifestException.
Mosca Pt,

2

Ho avuto lo stesso problema, ma nel mio caso inserisco una classe in un controllo utente che è correlato al controllo utente in questo modo

Public Class MyUserControlObject

end Class

Public Class MyUserCOntrol

end Class

La soluzione era spostare la MyUserControlObjectfine della classe Usercontrol, in questo modo

Public Class MyUserCOntrol

end Class

Public Class MyUserControlObject

end Class

Spero che aiuti


Parla di una descrizione dell'errore scadente ... Ho aggiunto una classe di supporto al file CS del modulo principale. Non avrei mai immaginato che il messaggio di errore si collegasse a questo. Grazie!
Adam Lewis,

1

Stavo ottenendo l'errore MissingManifestResourceException dopo aver portato il mio progetto da VS2005 a VS2010. Non avevo altre classi definite nel file che contiene la mia classe Form. E ho anche impostato il nome del file di risorse resx impostato correttamente. Non ha funzionato

Quindi ho eliminato i file resx e li ho rigenerati. Va tutto bene adesso.


1

Recentemente ho riscontrato lo stesso problema, lottato per 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 StartupUrida App.xaml. Credo che questa eccezione può accadere se si dispone di un errore in StartupUri, quindi in caso se qualcuno è alle prese con questo - controllare il vostro StartupUriin App.xaml.


1

Di recente mi sono imbattuto 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. Assicurarsi che lo spazio dei nomi predefinito dell'Assemblea (fare clic con il pulsante destro del mouse sul progetto e scegliere Proprietà) sia impostato allo stesso spazio dei nomi nel file delle risorse.

Una volta fatto il passaggio 2, l'eccezione è andata via.


1

Ho avuto questo problema quando ho aggiunto un'altra classe nel file appena prima della classe che derivava da Form. L'aggiunta dopo aver risolto il problema.


1

Inoltre, può verificarsi lo stesso errore quando si inserisce una nuova classe nel codice sorgente della classe del modulo creato da un designer.

Questa nuova classe può essere rimossa e inserita in un diverso file cs.

(Almeno nel mio caso questo era il problema ...)


0

Perché sto pre-compilando la mia applicazione web (usando la funzione di pubblicazione VS2012). Stavo ottenendo l'errore sopra. Ho provato tutti i suggerimenti, ma cambiare stranamente "Build Action" in "Content" ha funzionato!


0

Nel mio caso, ho un API web con risorse e creo un pacchetto nuget da quello. Quando utilizzo questo nuget in altri progetti, mi rendo conto che quando richiedo un API con risorse, ottengo MissingManifestResourceExceptionun po 'di ricerca, imparo che Nuget Packager non impacchetta automaticamente le risorse. Se si desidera utilizzare i file di risorse, è necessario farlo manualmente. Quindi è necessario aggiungere le righe seguenti al file .nuspec: (Visita 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>

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


0

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


0

Solo per citare. Se usi una costante o un valore letterale, assicurati che si riferisca a una risorsa del modulo ProjectName.Resourcese che non sia disponibileResources.resx .

Potrebbe farti risparmiare un'ora o due.


0

Ho riscontrato questo problema con il progetto C ++ gestito basato su WinForms dopo aver rinominato lo spazio dei nomi globale (non manualmente, ma con lo strumento Rinomina di VS2017).

La soluzione è semplice, ma non è menzionata altrove.

Devi modificare la RootNamespacevoce nel file vcxproj in modo che corrisponda allo spazio dei nomi C ++.


0

Nel mio caso era un refuso nel Xaml di una finestra aperta da Winforms Form:

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

Corretto: <Image Source="../Resources/WorkGreen.gif"/> può aiutare qualcuno


-3

Dalla pagina di supporto Microsoft :

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

Per aggirare questo problema, specificare il nome 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

1
Grazie per la tua risposta, ma non so cosa sia ResGen.exe, non l'ho mai usato e sinceramente non voglio usarlo perché non sto cercando di usare niente di speciale. Sicuramente ci deve essere un modo per risolvere questo problema da Visual Studio? Ad esempio, poiché dici che la risorsa è "localizzata", come posso dichiarare una risorsa non localizzata? Grazie ancora.
Timwi,
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.